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.
- La API de reproductor de YouTube para Android lanza "BadParcelableException ClaseNotFoundException al desmarcar: asc" con la nueva versión de YouTube
- Cómo obtener ClassLoader de variable de tipo (para parcelar una clase usando genéricos)
- GetParcelableArrayList devuelve null
- Cómo en Android pasar un objeto a un nuevo propósito
- Pon el Objeto como intención para la siguiente actividad
- Cómo utilizar writeStringArray () y readStringArray () en una parcela
- Android: Cualquier acceso directo a Serializable de Parcelable sin usar marshall ()?
- Android: pasar la lista <GeoPoint> a otra actividad
- Pase de ArrayList <? implementa Parcelable> a Actividad
- Uso de parceler (@Parcel) con Realm.io (Android)
- Errores de unmarshalling en la aplicación de Android con clases parcelables personalizadas
- No entiendo por qué se produce esta ClassCastException
- Hacer ArrayList de objetos personalizados parcelable
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!
- Reproducción de sonido procedente del micrófono en tiempo real
- Cómo aplicar clic de evento de escucha a la imagen en android