ClaseNotFoundException al desmarcar: android.support.v4.view.ViewPager $ SavedState

Estoy viendo el siguiente error en mis informes de fallos de Android:

android.os.BadParcelableException: ClassNotFoundException when unmarshalling: android.support.v4.view.ViewPager$SavedState at android.os.Parcel.readParcelable(Parcel.java:1971) at android.os.Parcel.readValue(Parcel.java:1859) at android.os.Parcel.readSparseArrayInternal(Parcel.java:2128) at android.os.Parcel.readSparseArray(Parcel.java:1581) at android.os.Parcel.readValue(Parcel.java:1916) at android.os.Parcel.readMapInternal(Parcel.java:2099) at android.os.Bundle.unparcel(Bundle.java:223) at android.os.Bundle.getSparseParcelableArray(Bundle.java:1225) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:806) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1083) at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:635) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1431) at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:431) at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:160) at android.support.v4.view.ViewPager.populate(ViewPager.java:895) at android.support.v4.view.ViewPager.populate(ViewPager.java:772) at android.support.v4.view.ViewPager.completeScroll(ViewPager.java:1539) at android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1422) at android.view.ViewGroup.drawChild(ViewGroup.java:3028) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) at android.view.ViewGroup.drawChild(ViewGroup.java:3184) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) at android.view.ViewGroup.drawChild(ViewGroup.java:3184) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) at android.view.ViewGroup.drawChild(ViewGroup.java:3184) at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2788) at android.view.View.draw(View.java:11017) at android.widget.FrameLayout.draw(FrameLayout.java:450) at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2175) at android.view.ViewRootImpl.draw(ViewRootImpl.java:2234) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1810) at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2695) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:4977) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) at dalvik.system.NativeStart.main(Native Method) 

Parece que ocurre intermitentemente al reanudar una actividad. No tengo acceso directo a la clase SavedState en ningún código.

Tuve el mismo error y aquí está lo que hice.

Mi problema provino de usar ViewPager con un FragmentStatePagerAdapter. Dentro de uno de los fragmentos del ViewPager había otro ViewPager. Tener ese segundo paginador de vista causó este insecto raro. Incluso con o sin un adaptador en él.

La solución era simplemente establecer setSaveEnabled (false); En el segundo ViewPager.

La siguiente solución funcionó para mí:

 package android.support.v4.app; import android.os.Bundle; import android.view.ViewGroup; public abstract class FixedFragmentStatePagerAdapter extends FragmentStatePagerAdapter { public FixedFragmentStatePagerAdapter(FragmentManager fm) { super(fm); } @Override public Object instantiateItem(ViewGroup container, int position) { Fragment f = (Fragment)super.instantiateItem(container, position); Bundle savedFragmentState = f.mSavedFragmentState; if (savedFragmentState != null) { savedFragmentState.setClassLoader(f.getClass().getClassLoader()); } return f; } } 

Desde http://code.google.com/p/android/issues/detail?id=37484#c1

Si no desea incluir la fuente en el paquete v4, puede declarar la "corrección" directamente en su adaptador

  @Override public Object instantiateItem(ViewGroup container, int position) { final Object fragment = super.instantiateItem(container, position); try { final Field saveFragmentStateField = Fragment.class.getDeclaredField("mSavedFragmentState"); saveFragmentStateField.setAccessible(true); final Bundle savedFragmentState = (Bundle) saveFragmentStateField.get(fragment); if (savedFragmentState != null) { savedFragmentState.setClassLoader(Fragment.class.getClassLoader()); } } catch (Exception e) { Log.w("CustomFragmentStatePagerAdapter", "Could not get mSavedFragmentState field: " + e); } return fragment; } 

En su Actividad / Fragmento, haga lo siguiente:

 public void onSaveInstanceState(Bundle outState){ //This MUST be done before saving any of your own or your base class's variables final Bundle mapViewSaveState = new Bundle(outState); mapView.onSaveInstanceState(mapViewSaveState); outState.putBundle("mapViewSaveState", mapViewSaveState); //Add any other variables here. super.onSaveInstanceState(outState); } public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); final Bundle mapViewSavedInstanceState = savedInstanceState != null ? savedInstance.getBundle("mapViewSaveState") : null; mapView.onCreate(mapViewSavedInstanceState); //.... } 

Fuente: https://code.google.com/p/gmaps-api-issues/issues/detail?id=6237

U otra solución es:

Map.onCreate (savedInstanceState);

a esto:

Map.onCreate (null);

La respuesta puede ser late.I utilizado FragmentPagerAdapter lugar de utilizar FragmentStatePagerAdapter Trabajó para mí como un encanto!

  • Restauración de la vista SavedState lanza ClassNotFoundException al desmarcar la vista principal SavedState
  • Cómo guardar ArrayList personalizado en la rotación de la pantalla de Android?
  • Persistencia de un objeto Parcelable en Android
  • Cómo implementar Parcelable para una clase que contenga List <List <String>?
  • Android Parcelable y objeto que pasa por referencia
  • Beneficio de usar Parcelable en lugar de serializar objetos
  • Pase la matriz 2D a otra actividad
  • No se puede pasar el objeto personalizado en un intento: El método Poner extra es ambiguo para el tipo Intención
  • Crear una copia del objeto de parcela
  • Android: ¿Cómo pasar el objeto Parcelable a la intención y el uso getParcelable método de paquete?
  • Leer y escribir un ArrayList de ArrayLists que contiene Objetos parcelables para pasar en un intento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.