使用回调在 DialogFragment 中传回数据 (android)

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

我有一个 DialogFragment,允许用户在同一个 Fragment 中过滤和搜索。过滤器通过使用回调接口将数据传回主机 activity/fragment 来工作。在我将 SearchView 添加到 DialogFragment 之前,这似乎工作得很好,因为当我输入文本并单击搜索时它可以工作,但随后抛出以下异常并崩溃:

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

...

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

为了执行回调,我使用了相当标准的回调接口模式。该接口扩展了 Serializable。这是我的回调代码:

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);
}

这似乎与使用实现可序列化的匿名内部 class 有关,所以我想知道:

1) 为什么我只在使用 SearchView 时收到此异常,而不是在我执行通过回调发回数据的操作或只是单击退出对话框时收到此异常。

2) 这里是否有解决方法,或者这对我来说只是一个不好的模式。

我在这里找到了这个问题的答案:Callback to a Fragment from a DialogFragment

它们的关键是 "setTargetFragment" 方法,它允许您告诉片段将其结果发送到哪个片段。这使您可以避免为回调序列化接口引用。

class 的所有字段必须序列化,否则你应该得到 NotSerializableException。 如果您检查异常堆栈,您将能够找到未序列化的对象。