ViewPager和Fragments - java.lang.RuntimeException:Parcel:无法编组值MyFragment {af26794#1 id = 0x7f0e0120}

时间:2016-08-11 00:29:42

标签: android android-fragments android-viewpager

每当我通过按下主页按钮或开始新活动将片段留给ViewPager时,我都会崩溃。我认为这与调用onPause有关,因为如果我离开活动。

是否有其他人在使用ViewPagersFragments时遇到过此问题?

我看到另一个帖子,那个人把他的碎片设置为Serializable,但这对我来说似乎有些笨拙?

FATAL EXCEPTION: main
                                                                           Process: com.myapp.myapp, PID: 16504
                                                                           java.lang.RuntimeException: Parcel: unable to marshal value MyFragment{4f941f6 #1 id=0x7f0e0120}
                                                                               at android.os.Parcel.writeValue(Parcel.java:1418)
                                                                               at android.os.Parcel.writeMapInternal(Parcel.java:662)
                                                                               at android.os.Parcel.writeMap(Parcel.java:646)
                                                                               at android.os.Parcel.writeValue(Parcel.java:1336)
                                                                               at android.os.Parcel.writeArrayMapInternal(Parcel.java:686)
                                                                               at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330)
                                                                               at android.os.Bundle.writeToParcel(Bundle.java:1079)
                                                                               at android.os.Parcel.writeBundle(Parcel.java:711)
                                                                               at android.support.v4.app.FragmentState.writeToParcel(Fragment.java:138)
                                                                               at android.os.Parcel.writeTypedArray(Parcel.java:1254)
                                                                               at android.support.v4.app.FragmentManagerState.writeToParcel(FragmentManager.java:385)
                                                                               at android.os.Parcel.writeParcelable(Parcel.java:1437)
                                                                               at android.os.Parcel.writeValue(Parcel.java:1343)
                                                                               at android.os.Parcel.writeArrayMapInternal(Parcel.java:686)
                                                                               at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1330)
                                                                               at android.os.Bundle.writeToParcel(Bundle.java:1079)
                                                                               at android.os.Parcel.writeBundle(Parcel.java:711)
                                                                               at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3152)
                                                                               at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3417)
                                                                               at android.os.Handler.handleCallback(Handler.java:739)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:148)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

使用ViewPager进行片段化

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/quiz_accent_background">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/textview_current_question"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_gravity="center_vertical"
            android:padding="@dimen/content_padding_half"
            android:textSize="@dimen/profile_text_normal"/>

        <TextView
            android:id="@+id/textview_time_left"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:gravity="right"
            android:padding="@dimen/content_padding_half"
            android:textStyle="bold"
            android:textSize="@dimen/profile_text_normal"/>

    </LinearLayout>

    <include layout="@layout/gray_horizontal_divider_view"/>

    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

1 个答案:

答案 0 :(得分:1)

在没有看到您的实际代码的情况下,您似乎正在尝试从包中存储/检索Fragment的实例?这绝对不是你应该做的事情有很多原因,即使你确实让你的Fragment实现Serializable,因为你在Fragment中连接的任何监听器,回调等都是无效的。

在许多情况下,您可能尝试这样做,但在您的情况下,从堆栈跟踪看起来可能是由于onSaveInstanceState而发生的。

您应该只保留片段的关键Serializable / Parcelable成员来表示onSaveInstanseState中片段的状态,而不是尝试存储整个Fragment实例。然后,在片段“onCreate”中恢复这些状态变量。