每当我通过按下主页按钮或开始新活动将片段留给ViewPager
时,我都会崩溃。我认为这与调用onPause
有关,因为如果我离开活动。
是否有其他人在使用ViewPagers
和Fragments
时遇到过此问题?
我看到另一个帖子,那个人把他的碎片设置为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>
答案 0 :(得分:1)
在没有看到您的实际代码的情况下,您似乎正在尝试从包中存储/检索Fragment的实例?这绝对不是你应该做的事情有很多原因,即使你确实让你的Fragment实现Serializable,因为你在Fragment中连接的任何监听器,回调等都是无效的。
在许多情况下,您可能尝试这样做,但在您的情况下,从堆栈跟踪看起来可能是由于onSaveInstanceState而发生的。
您应该只保留片段的关键Serializable / Parcelable成员来表示onSaveInstanseState中片段的状态,而不是尝试存储整个Fragment实例。然后,在片段“onCreate”中恢复这些状态变量。