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クラスに直接アクセスすることはありません。
同じエラーが発生しました。これが私がしたことです。
私の問題は、FragmentStatePagerAdapterでViewPagerを使用することから発生しました。 ViewPagerのフラグメントの1つに、別のViewPagerがありました。その2番目のビューページャーがあると、このまれなバグが発生しました。アダプターの有無にかかわらず。
解決策は、単にsetSaveEnabled(false);を設定することでした。 2番目の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;
}
}
から http://code.google.com/p/Android/issues/detail?id=37484#c1
アクティビティ/フラグメントで、次の手順を実行します。
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);
ソースを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
を使用しました。魅力のように私のために働きました!