我有一个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)这里有解决方法,或者这对我来说只是一个糟糕的模式。
答案 0 :(得分:0)
我在这里找到了这个问题的答案:Callback to a Fragment from a DialogFragment
它们的键是“setTargetFragment”方法,它允许您告诉片段将结果发送到哪个片段。这使您可以避免必须序列化回调的接口引用。
答案 1 :(得分:0)
类的所有字段都必须是序列化的,否则你应该得到NotSerializableException。 如果检查异常堆栈,您将能够找到未序列化的对象。