Search code examples
javaandroidserializationcallbackandroid-dialogfragment

Using callbacks to pass back data in a DialogFragment (android)


I have a DialogFragment that allows users to filter and search in the same Fragment. The filter works by passing back data to the hosting activity/fragment using a callback interface. This seemed to work great until I added a SearchView to the DialogFragment as when I enter text and click search it works but then throws the following expception and crashes:

Parcelable encountered IOException writing serializable object (name = com.braden.android.fragments.ListItemFragment$6)

...

Caused by: java.io.NotSerializableException: com.braden.android.fragments.ListItemFragment

To do the callback I used a fairly standard callback interface pattern. The interface extends Serializable. Here's the code for my callback:

private void displayFilter() {

    FilterCategoryDialogFragment filterCategoryDialogFragment = new FilterCategoryDialogFragment();
    Bundle bundle = new Bundle();

    mOnFilterClickListener = new OnFilterClickListener() {
        @Override
        public void onCategoryClickListener(String filterName) {
            updateVenues(mFilter);
        }
    };

bundle.putSerializable("listenerFilter", 
mOnFilterClickListener);
filterCategoryDialogFragment.setArguments(bundle);
    filterCategoryDialogFragment.show(getFragmentManager(), DIALOG_CATEGORY_FILTER);
}

This seems to have something to do with using an anonymous inner class that implements serializable so I'm wondering:

1) Why is it that I'm only receiving this exception when I use SearchView and not when I perform an action to send back data via callback or simply click out of the dialog.

2) Is there a workaround here or is this just a bad pattern for me to use.


Solution

  • I found the answer to this question here: Callback to a Fragment from a DialogFragment

    They key is the "setTargetFragment" method which allows you to tell a fragment which fragment to send its result to. This allows you to avoid having to serialize an interface reference for the callback.