解包时ClassNotFoundException:android.support.v4.view.ViewPager$SavedState
我在Android崩溃报告中看到以下错误:解包时ClassNotFoundException:android.support.v4.view.ViewPager$SavedState,android,android-viewpager,parcelable,Android,Android Viewpager,Parcelable,我在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.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类。我也有同样的错误,下面是我所做的 我的问题来自将ViewPager与FragmentStatePagerAdapter一起使用。在ViewPager的一个片段中有另一个ViewPager。拥有第二视图寻呼机导致了这种罕见的错误。即使上面有或没有适配器
解决方案是简单地设置setSaveEnabled(false);在第二个ViewPager上。以下解决方案适合我:
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;
}
回答可能晚了。我用了
FragmentPagerAdapter
而不是FragmentStatePagerAdapter
。为我工作得很有魅力 在活动/片段中,执行以下操作:
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);
//....
}
资料来源:
或另一种解决方案是:
map.onCreate(savedInstanceState)
为此:
map.onCreate(null) 我正在经历一个类似的问题,事实上,我敢说这是完全一样的。当我将我的
FragmentPagerAdapter
切换到'FragmentStatePagerAdapter'时,它就开始发生了。你知道为什么会这样吗?你应该尝试在堆栈溢出问题中加入一些代码。code.google.com上有一个与此相关的错误:@user379806,在这个错误报告中,有一个解决方法可以解决这个问题。这显然是一个安卓错误。你能给这个答案添加一个摘要吗?这将使这个答案仍然有用,即使链接发生了变化,或者内容被删除或编辑,或者诸如此类。什么是mSavedFragmentState?在我的项目中的Fragment对象中找不到它。它是受保护的字段。您必须将适配器放入程序包android.support.v4.app中才能访问它…+1这正是发生在我身上的一个ViewPager在另一个ViewPager中给出错误,感谢您的简单解决方案!到目前为止,令人难以置信的安卓系统并没有解决这个问题。这并不是在所有安卓操作系统中都能始终如一地工作。它在某些操作系统中崩溃。当您开始在多个设备和操作系统版本中进行测试时,您会看到这一点。这是完全不相关的。我在map view中遇到了相同的异常,现在可以找到此解决方案及其对我的grt的作用。mapView
将在OnCreate()中为空
…这是如何工作的?这是当您在xml文件中声明MapView并使用findViewById获取.1时,尽管您最好不要将异常连接到日志消息(因为它不可能在内部调用e.toString()
将返回一些有用的内容),但要单独传递它:log.w(“自定义…”,“无法…”,e)
。