Java.io.NotSerializableException при нажатии кнопки «Назад»

Я пытаюсь разработать небольшое приложение для Android. Приложение прост, после просмотра в режиме ожидания я показываю Activity, в котором размещается ListFragment. Когда пользователь нажимает на элементы списка, я хочу создать новый фрагмент, содержащий детали щелкнутого элемента. Итак, для этого мой код выглядит так:

public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final FragmentManager fragmentManager = getFragmentManager(); final Fragment listFragment = MyListFragment.newInstance(new MyItemClickListener() { @Override public void displayDetailsFor(Item item) { final FragmentTransaction transaction = fragmentManager.beginTransaction(); transaction.replace(R.id.fragment_container, DetailsFragment.newInstance(status)); transaction.addToBackStack(null); transaction.commit(); } }); final Fragment container = fragmentManager.findFragmentById(R.id.fragment_container); if (container == null) { final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.add(R.id.fragment_container, listFragment); fragmentTransaction.commit(); } } } 

Интерфейс MyItemClickListener:

 public interface MyItemClickListener extends Serializable { void displayDetailsFor(Status status); } 

Чтобы завершить эту вещь, в моем фрагменте списка, когда пользователь выбирает элемент, я просто вызываю метод слушателя следующим образом:

 @Override public void onListItemClick(ListView l, View v, int position, long id) { final Item item = (Item) getListAdapter().getItem(position); myItemClickListener.displayDetailsFor(item); } 

Кажется, что все работает отлично, фрагменты с деталями заполняются правильно и заменяются фрагментом списка. Однако, когда я нажимаю кнопку «Назад», чтобы вывести фрагмент списка из заднего стека, генерируется исключение. Вот подробности:

 java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = package.MainActivity$1) at android.os.Parcel.writeSerializable(Parcel.java:1316) at android.os.Parcel.writeValue(Parcel.java:1264) at android.os.Parcel.writeArrayMapInternal(Parcel.java:618) at android.os.Bundle.writeToParcel(Bundle.java:1692) at android.os.Parcel.writeBundle(Parcel.java:636) at android.app.FragmentState.writeToParcel(Fragment.java:132) at android.os.Parcel.writeTypedArray(Parcel.java:1133) at android.app.FragmentManagerState.writeToParcel(FragmentManager.java:373) at android.os.Parcel.writeParcelable(Parcel.java:1285) at android.os.Parcel.writeValue(Parcel.java:1204) at android.os.Parcel.writeArrayMapInternal(Parcel.java:618) at android.os.Bundle.writeToParcel(Bundle.java:1692) at android.os.Parcel.writeBundle(Parcel.java:636) at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:2467) at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3098) at android.os.Handler.handleCallback(Handler.java:733) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:136) at android.app.ActivityThread.main(ActivityThread.java:5017) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) at dalvik.system.NativeStart.main(Native Method) Caused by: java.io.NotSerializableException: package.MainActivity at java.io.ObjectOutputStream.writeNewObject(ObjectOutputStream.java:1364) at java.io.ObjectOutputStream.writeObjectInternal(ObjectOutputStream.java:1671) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1517) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:1481) at java.io.ObjectOutputStream.writeFieldValues(ObjectOutputStream.java:979) at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:368) ... 

Я попытался решить эту проблему, добавив обработчик обратной кнопки:

 @Override public void onBackPressed() { final FragmentManager fragmentManager = getFragmentManager(); if (fragmentManager.getBackStackEntryCount() > 0) {{ fragmentManager.popBackStack(); } } 

И, кажется, работает нормально, но когда я снова попадаю в список, и я нажимаю кнопку «Назад», появляется такое же исключение. Я что-то упускаю?

Благодаря!

Хотя стек вызовов является неполным, проблема, вероятно, связана с использованием шаблона создания фрагмента MyListFragment.newInstance (). Если вы используете setArguments () и передаете только что созданный OnClickListener, он ссылается на класс Activity (поскольку это нестатический внутренний класс Activity).

Классы активности не являются сериализуемыми, поэтому исключение возникает при создании пакета.

Я хотел бы предложить, чтобы Activity реализовал интерфейс MyItemClickListener (уже не Serializable) и вызывая это из фрагмента. Например, в прослушивателе кликов выполните:

 ((MyItemClickListener)getActivity()).displayDetailsFor(status). 

Например, вы можете увидеть http://www.vogella.com/tutorials/AndroidFragments/article.html#fragments_activitycommunication

Intereting Posts
Android :: Как изменить тему из другого apk программно Очки для запоминания при тестировании приложения для Android DownloadManager – понимание ERROR_HTTP_DATA_ERROR Получить серийный номер устройства Android-устройства Как реализовать распознавание жестов при износе android Создание шрифтов на больших экранах Изменить разрешение файла в приложении Как визуализировать видео через openGLES2 с Android NDK Невозможно заставить @ViewById работать внутри @EBean Android: как воссоздать панель действий при изменении фрагмента Как узнать, было ли мое текстовое представление эллипсисом? Как вы улавливаете URL-адреса, используя фильтр намерений с определенным значением параметра Как получить размер текста в SP (масштабированный пиксель) непосредственно из TextView? Предоставляет ли ведущий знания о Activity / Context плохую идею в шаблоне MVP? Как использовать неявный тип гранта в OAuth 2.0 для мобильных приложений?