我正在开发一个Android应用程序,其中片段使用动态创建的视图。我片段中onSaveInstanceState()
方法的一部分如下:
outState.putSerializable("intToRow", (HashMap<Integer, View>) intToRow);
当我评论这一行时,一切正常。我现在已经离开了这条线,这就是问题所在: 当我旋转屏幕时,这很好用,我可以使用
在onCreate()
中访问它
intToRow = (HashMap) savedInstanceState.getSerializable("intToRow");
当按下操作栏上的后退按钮时,片段和活动关闭没有任何问题。那么为什么当我按下主页按钮或多任务按钮时,应用程序会崩溃?堆栈跟踪是:
java.lang.RuntimeException: Parcel: unable to marshal value android.widget.TextView{383ee509 V.ED.... ........ 246,0-492,57 #3}
at android.os.Parcel.writeValue(Parcel.java:1337)
at android.os.Parcel.writeMapInternal(Parcel.java:614)
at android.os.Parcel.writeMap(Parcel.java:598)
at android.os.Parcel.writeValue(Parcel.java:1255)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:638)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
at android.os.Bundle.writeToParcel(Bundle.java:1096)
at android.os.Parcel.writeBundle(Parcel.java:663)
at android.app.FragmentState.writeToParcel(Fragment.java:147)
at android.os.Parcel.writeTypedArray(Parcel.java:1191)
at android.app.FragmentManagerState.writeToParcel(FragmentManager.java:380)
at android.os.Parcel.writeParcelable(Parcel.java:1357)
at android.os.Parcel.writeValue(Parcel.java:1262)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:638)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
at android.os.Bundle.writeToParcel(Bundle.java:1096)
at android.os.Parcel.writeBundle(Parcel.java:663)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3116)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3695)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5832)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
我已经看到很多关于整个Parcel: unable to marshal value
错误的问题,但我的错误似乎并不匹配。在我的应用程序中,方向更改和销毁片段似乎完美地工作,但按下Home按钮会使其崩溃。我已经度过了Android生命周期,但是当看不到Home时,我看不到任何应该发生的事情。
答案 0 :(得分:1)
这个答案的确使我朝着正确的方向前进,但是实现过程令人困惑。 该类可能是
public class item { ... }
要解决元帅问题,只需使类可序列化
public class item implements Serializable { .. }
希望这可以帮助某人...
答案 1 :(得分:0)
我也在努力找到解决这个问题的方法。
我的方形和圆形按钮导致应用程序崩溃,而更改方向并未导致其崩溃。
我认为它一定与RecyclerView或Fragment有关,但我终于意识到这是一个包裹问题。
似乎没有任何明确的解决方案(我搜索和排除故障超过一个小时),所以这是解决方案:
问这个问题的人显示他的logcat说
Parcel: unable to marshal value ______
对他而言,______是android.widget.TextView,但它可能是其他人的其他东西。
无论那个类是什么,问题在于它是Parceled但是没有实现Parcelable。
因此解决方案是为该类实现Parcelable。
我很困惑,因为我已经为我正在Parceling的类实现了Parcelable,但是我不知道我还必须为所有与该主对象类进行Parceled的子类实现Parcelable。
这是为相关类实现Parcelable的方法:
1)检查logcat并找到“无法编组值______”的地方(其中______将是您问题的相关课程。)
2)转到相关类的.java文件(如果问题是默认类或不是您的自定义类,则需要创建一个扩展该类的新类,然后转到该类。 java文件)
3)在编辑器中左键单击类名,然后按alt + insert(显示Generate菜单),然后单击Parcelable,然后按OK
4)尝试再次运行您的应用并重现问题。如果它再次发生,请再次检查logcat,因为你可能有多个类需要实现Parcelable(我有2个子类需要实现Parcelables),所以每次检查logcat并为每个类做同样的事情。
5)如果您有多个活动/片段,请尝试在每个页面上重现问题,这样您就不会错过任何其他具有相同问题的课程。
就是这样!
干杯。