2012-07-08 5 views
31

Ich bin den folgenden Fehler in meinem Android-Crash-Berichte zu sehen:

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) 

Es scheint zeitweise zu passieren, wenn eine Tätigkeit wieder aufnehmen. Ich greife nicht direkt auf die SavedState-Klasse in irgendeinem Code zu.

+0

Ich habe ein ähnliches Problem, in der Tat, ich wage zu sagen, es ist identisch. Es begann, als ich meinen "FragmentPagerAdapter" auf "FragmentStatePagerAdapter" umstellte. Hast du herausgefunden, warum das passiert ist? P.D: Sie sollten versuchen, einen Code von Ihnen in Ihre Stapelüberlauffragen aufzunehmen. – mdelolmo

+1

Es gibt einen Fehler auf code.google.com, der damit zusammenhängt: http://code.google.com/p/android/issues/detail?id=37484 – JWGS

+0

@ user379806, in diesem Fehlerbericht gibt es eine Problemumgehung löst das Problem tatsächlich. Es scheint sicherlich ein Android-Bug zu sein. – mdelolmo

Antwort

26

Ich hatte den gleichen Fehler und hier ist was ich getan habe.

Mein Problem kam von der Verwendung des ViewPager mit einem FragmentStatePagerAdapter. In einem der Fragmente vom ViewPager befand sich ein weiterer ViewPager. Dieser seltene Pug verursacht diesen seltenen Bug. Auch mit oder ohne Adapter drauf.

Die Lösung war, setSaveEnabled (false) einfach zu setzen; auf dem zweiten ViewPager.

+3

+1 Dies passierte genau bei mir ein ViewPager in einem anderen ViewPager, der den Fehler gab, danke für deine einfache Lösung! Unglaubliche Android bis heute hat diesen Fehler nicht gelöst. – pvalle

14

Nach Lösung für mich gearbeitet:

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; 
    } 

} 

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

+0

Können Sie bitte eine Zusammenfassung zu dieser Antwort hinzufügen? Das würde diese Antwort noch nützlich machen, selbst wenn sich der Link ändert oder der Inhalt gelöscht oder bearbeitet wird oder was auch immer. –

+0

Was ist mSavedFragmentState? Es wurde nicht in dem Fragment-Objekt in meinem Projekt gefunden. – tasomaniac

+1

Es ist ein geschütztes Feld. Sie müssen Ihren Adapter in das Paket android.support.v4.app setzen, um darauf zuzugreifen ... – Kuno

8

Wenn Sie möchten, um die Quelle in v4-Paket nicht enthalten, die Sie erklären können die "fix" direkt in Ihrem Adapter

@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; 
    } 
+1

+1, obwohl Sie besser keine Ausnahme verketten sollten, um die Nachricht zu protokollieren (da es nicht wahrscheinlich intern als 'e.toString() bezeichnet wird) 'wird etwas Nützliches zurückgeben, aber übergeben Sie es separat:' Log.w ("Benutzerdefiniert ...", "Konnte nicht ...", e) '. –

+0

@NikitaBosik danke, behoben. –

2

Antwort kann verspätet sein.Ich habe FragmentPagerAdapter anstelle von FragmentStatePagerAdapter .Arbeit für mich wie ein Charme!

+2

Dies funktioniert nicht einheitlich in allen Android OS. Es stürzt in einigen Betriebssystemen ab. Sie sehen dies, wenn Sie in mehreren Geräten und Betriebssystemversionen testen. –

7

In Ihrer Aktivität/Fragment, gehen Sie wie folgt vor:

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); 
//.... 
} 

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

oder eine andere Lösung:

map.onCreate (savedInstanceState);

dazu:

map.onCreate (null);

+0

Dies ist völlig unabhängig –

+0

Ich war mit der gleichen Ausnahme in der Kartenansicht konfrontiert, und finden Sie diese Lösung und ihre Arbeit für mich jetzt GRT. – Mubarak

+0

Und meine MapView funktionierte nicht richtig. – Malder

Verwandte Themen