我有CustomDialog
类延伸DialogFragment.
我覆盖onCreateDialog
方法,以获得我想要的自定义对话框。Android听众序列化
@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;
}
当我实现了从活动OnViewInitListener
,在方向改变的东西如预期: onCreateDialog
被称为每次片段重新创建,和疗法都没有包裹的错误,但是当我按应用历史按钮(最右边)
我得到这个错误:
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无法处理活动parcelation。
任何人都可以建议如何处理这个问题,或建议更好的解决方案。
给包裹写什么都没有收获。这不是坚持或反序列化任何事情。当实例状态恢复时,您需要从活动中设置侦听器。不要坚持一无所有。这个答案比崩溃要糟糕得多,因为它会在达到内存限制的边缘情况下悄悄地破坏工作监听器。这可能会导致巨大的错误在生产中被忽视。 – colintheshots 2017-05-09 03:05:45
为什么它甚至可以工作?实际上,它也可以在没有明确坚持onSaveInstanceState的情况下工作。 'getArguments()。getParcelable(“listener”)'总是返回传递给Bundle的同一个对象,而不管手机方向改变了多少次。 – 2017-11-20 22:17:36