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

时间:2017-06-16 20:33:27

标签: java android serialization callback android-dialogfragment

我有一个DialogFragment,允许用户过滤和搜索相同的片段。过滤器的工作原理是使用回调接口将数据传回主机活动/片段。这似乎很有效,直到我将DialView添加到DialogFragment,因为当我输入文本并单击搜索它可以工作,但然后抛出以下表示并崩溃:

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

...

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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