2012-07-08 115 views
31

我看到下面的錯誤在我的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) 

恢復活動時,這似乎是間歇性地發生。我不直接訪問任何代碼中的SavedState類。

+0

我遇到了類似的問題,的確,我敢說它是完全相同的。當我將我的'FragmentPagerAdapter'切換到'FragmentStatePagerAdapter時,它開始發生。你知道爲什麼發生了嗎? P.D:你應該嘗試在你的堆棧溢出問題中包含你的一些代碼。 – mdelolmo 2012-09-13 14:47:54

+1

code.google.com上存在一個與此相關的錯誤:http://code.google.com/p/android/issues/detail?id=37484 – JWGS 2012-10-01 12:42:27

+0

@ user379806,在該錯誤報告中,有一種解決方法是實際上解決了這個問題。這當然似乎是一個Android錯誤。 – mdelolmo 2012-10-17 22:14:29

回答

26

我有同樣的錯誤,這就是我所做的。

我的問題來自使用ViewPager和FragmentStatePagerAdapter。在ViewPager的其中一個片段中有另一個ViewPager。有第二個查看尋呼機造成這個罕見的錯誤。即使有或沒有適配器。

解決方案是簡單地設置setSaveEnabled(false);在第二個ViewPager上。

+3

+1這正是發生在我ViewPager另一個ViewPager給出的錯誤,感謝您的簡單解決方案!到目前爲止,令人難以置信的Android並沒有解決這個問題。 – pvalle 2014-07-02 06:38:57

14
+0

您能否爲此答案添加摘要?即使鏈接發生變化或內容被刪除或編輯或者其他任何內容,這將使這個答案仍然有用。 – 2012-12-20 16:59:37

+0

什麼是mSavedFragmentState?它不能在我的項目中的Fragment對象中找到。 – tasomaniac 2013-09-25 09:11:16

+1

這是一個受保護的領域。你必須把你的適配器放在android.support.v4.app包中以訪問它... – Kuno 2013-09-28 20:39:34

8

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

} 

如果您不想要在V4包的源,你可以聲明在您的適配器「修復」直接

@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,儘管你最好不要把異常連接到日誌消息(因爲它不可能在內部叫做'e.toString() '會返回一些有用的東西),但分別傳遞它:'Log.w(「Custom ...」,「Could not ...」,e)'。 – 2018-02-11 00:05:03

+0

@NikitaBosik謝謝,修正。 – 2018-02-11 11:39:24

2

答案可能會很晚。我用FragmentPagerAdapter代替了FragmentStatePagerAdapter。爲我工作就像一個魅力!

+2

這不適用於所有Android操作系統。它在某些操作系統中崩潰。當您在多個設備和操作系統版本中開始測試時,您會看到這一點。 – 2016-07-21 05:37:13

7

在您的活動/片段,執行以下操作:

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

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

或另一種解決方案是:

map.onCreate(savedInstanceState);

對此:

map.onCreate(null);

+0

這完全不相關 – 2016-10-20 22:41:49

+0

我在地圖視圖中遇到了同樣的異常,並且現在找出這個解決方案及其對我的幫助。 – Mubarak 2016-10-21 06:19:37

+0

而我的MapView無法正常工作。 – Malder 2016-11-06 21:02:39

相關問題