【发布时间】:2014-12-04 01:17:57
【问题描述】:
我有扩展 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 类型的侦听器方法listener.onViewInit(view, this),它是接口并扩展了Serializable,将自定义代码绑定到视图(查看文本、侦听器等),这样在旋转时我想失去我的按钮按下逻辑。
@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 无法处理活动打包。
谁能建议如何处理这个问题,或建议更好的解决方案。
【问题讨论】:
标签: android dialog fragment parcel