У меня есть 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;
}
Это код создания пользовательского диалога. После того, как просмотр завышен, я вызываю метод прослушивания listener.onViewInit(view, this)
типа OnViewInitListener
, который является интерфейсом и расширяет 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
вызывается каждый фрагмент раз заново, и Ther ошибок нет посылок, но когда я нажимаю приложениям кнопку истории (на крайний справа)
Я получаю эту ошибку:
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 не может обрабатывать транзакцию Activity.
Может кто-нибудь предложить, как справиться с этой проблемой или посоветовать лучшее решение.
Ничего не пишу на посылку, ничего нам не приносит. Это не является продолжением или десериализацией чего-либо вообще. Вы должны установить слушателя из активности, когда состояние экземпляра будет восстановлено. Не сохраняйте указатель на ничего. Этот ответ намного хуже, чем сбой, потому что он будет бесшумно нарушать работу слушателей в крайних случаях, когда достигаются пределы памяти. Это может привести к тому, что огромные ошибки будут незаметны в производстве. – colintheshots
Почему это даже работает? Фактически, он также работает без явного сохранения onSaveInstanceState. 'getArguments(). getParcelable (" listener ")' всегда возвращает тот же объект, переданный в Bundle, независимо от того, сколько раз изменяется ориентация телефона. –