2012-07-08 47 views
31

Tôi nhìn thấy những lỗi sau đây trong báo cáo sự cố Android của tôi:

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) 

Nó dường như xảy ra liên tục khi nối lại hoạt động. Tôi không trực tiếp truy cập vào lớp SavedState trong bất kỳ mã nào.

+0

Tôi đang gặp phải một vấn đề tương tự, thực sự, tôi dám nói rằng nó giống hệt nhau. Nó bắt đầu xảy ra khi tôi chuyển 'FragmentPagerAdapter' thành' FragmentStatePagerAdapter. Đã không yuo tìm hiểu lý do tại sao điều đó đã xảy ra? P.D: Bạn nên cố gắng bao gồm một số mã của bạn trong các câu hỏi tràn ngăn xếp của bạn. – mdelolmo

+1

Có lỗi trên code.google.com liên quan đến điều này: http://code.google.com/p/android/issues/detail?id=37484 – JWGS

+0

@ user379806, trong báo cáo lỗi đó, có một giải pháp thay thế thực sự giải quyết vấn đề. Nó chắc chắn có vẻ là một lỗi Android. – mdelolmo

Trả lời

26

Tôi đã gặp lỗi tương tự và đây là những gì tôi đã làm.

Sự cố của tôi xuất phát từ việc sử dụng ViewPager với FragmentStatePagerAdapter. Bên trong một trong những Fragments từ ViewPager có một ViewPager khác. Có máy nhắn tin xem thứ hai gây ra lỗi hiếm này. Ngay cả khi có hoặc không có bộ điều hợp trên đó.

Giải pháp là chỉ cần đặt setSaveEnabled (sai); trên ViewPager thứ hai.

+3

+1 Điều này chính xác xảy ra với tôi một ViewPager bên trong một ViewPager khác cho lỗi, nhờ giải pháp đơn giản của bạn! Android đáng kinh ngạc cho đến hôm nay đã không giải quyết được lỗi này. – pvalle

14

giải pháp sau làm việc cho tôi:

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

} 

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

+0

Bạn có thể thêm tóm tắt vào câu trả lời này không? Điều đó sẽ làm cho câu trả lời này vẫn hữu ích ngay cả khi liên kết thay đổi hoặc nội dung bị xóa hoặc chỉnh sửa hoặc bất kỳ điều gì. –

+0

mSavedFragmentState là gì? Nó không thể được tìm thấy trong đối tượng Fragment trong dự án của tôi. – tasomaniac

+1

Đó là trường được bảo vệ. Bạn phải đặt bộ điều hợp của bạn trong gói android.support.v4.app để truy cập nó ... – Kuno

8

Nếu bạn không muốn bao gồm các nguồn trong gói v4 bạn có thể tuyên bố "sửa chữa" trực tiếp trong Adaptor của bạn

@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, mặc dù bạn không nên ghép nối ngoại lệ với thông điệp tường trình (vì nó không có khả năng được gọi nội bộ là 'e.toString() 'sẽ trả về một cái gì đó hữu ích), nhưng vượt qua nó một cách riêng biệt:' Log.w ("Custom ...", "Could not ...", e) '. –

+0

@NikitaBosik cảm ơn, đã sửa. –

2

Trả lời có thể trễ. Tôi đã sử dụng FragmentPagerAdapter thay vì sử dụng FragmentStatePagerAdapter. Làm việc cho tôi như một sự quyến rũ!

+2

Điều này không hoạt động nhất quán trong tất cả hệ điều hành Android. Nó bị treo trong một số hệ điều hành. Bạn sẽ thấy điều này khi bạn bắt đầu thử nghiệm trong nhiều thiết bị và phiên bản hệ điều hành. –

7

Trong hoạt động của bạn/Fragment, làm như sau:

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

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

này hay cách khác giải pháp là:

map.onCreate (savedInstanceState);

cho điều này:

map.onCreate (null);

+0

Điều này là hoàn toàn không liên quan –

+0

Tôi đã phải đối mặt với ngoại lệ tương tự trong xem bản đồ, và tìm ra giải pháp này và làm việc của nó cho tôi grt bây giờ. – Mubarak

+0

Và MapView của tôi không hoạt động chính xác. – Malder

Các vấn đề liên quan