我有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