我有一个扩展了DialogFragment
的CustomDialog
类。我重写了onCreateDialog
方法,以获取我想要的自定义对话框。
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
dialog = new Dialog(activity, styleId);
view = activity.getLayoutInflater().inflate(layoutId, null);
dialog.setContentView(view);
if (listener != null) {
listener.onViewInit(view, this);
}
return dialog;
}
这是自定义对话框创建代码。在视图被填充后,我调用类型为OnViewInitListener
的接口和Serializable的listener.onViewInit(view, this)
监听器方法,将自定义代码绑定到视图(视图文本、监听器等),以便在旋转时不会丢失按钮按下逻辑。
@Override
public void onSaveInstanceState(Bundle bundle) {
bundle.putInt("layoutId", layoutId);
bundle.putInt("styleId", styleId);
bundle.putSerializable("listener", listener);
super.onSaveInstanceState(bundle);
}
public RsCustomDialog setOnListenerAssignment(OnViewInitListener listener) {
this.listener = listener;
return this;
}
当我从Activity实现
OnViewInitListener
时,在方向更改时一切都按预期工作:每次重建片段时都会调用onCreateDialog
,并且没有包错误,但是当我按应用程序历史记录按钮(最右侧)时,出现以下错误:(来源:cbsistatic.com) 我收到了这个错误信息:
10-09 11:09:38.256: E/AndroidRuntime(24153): FATAL EXCEPTION: main
10-09 11:09:38.256: E/AndroidRuntime(24153): java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = base.RsCustomDialog$OnClickListener)
10-09 11:09:38.256: E/AndroidRuntime(24153): at android.os.Parcel.writeSerializable(Parcel.java:1279)
10-09 11:09:38.256: E/AndroidRuntime(24153): at android.os.Parcel.writeValue(Parcel.java:1233)
10-09 11:09:38.256: E/AndroidRuntime(24153): at android.os.Parcel.writeMapInternal(Parcel.java:591)
10-09 11:09:38.256: E/AndroidRuntime(24153): at android.os.Bundle.writeToParcel(Bundle.java:1627)
10-09 11:09:38.256: E/AndroidRuntime(24153): at android.os.Parcel.writeBundle(Parcel.java:605)
10-09 11:09:38.256: E/AndroidRuntime(24153): at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:133)
我猜这是因为当我从我的活动中实现OnViewInitListener
时,Java会将活动变量隐式放置在已实现的对象中,而Parcel无法处理活动的封装。
有人可以建议如何解决这个问题,或提供更好的解决方案吗?