java - 无法保存RelativeLayout的状态

标签 java android parcelable serializable android-savedstate

我正在制作一个应用程序,该应用程序具有用户可以将图片添加到对象的 Activity ,在这里我让用户选择是从图库中选择图片还是使用相机制作新图片。这两个选项都会启动一个 Intent,该 Intent(在用户选择完图片后)返回到其来源的 Activity。

但我遇到的问题是,当用户回来时,有时该 Activity 的一些数据会丢失,因此我使用保存的实例“重新加载”它。我尝试保存的对象之一是扩展RelativeLayout 的自定义 View 的数组列表。但是当我加载以下数据时,出现以下错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sition.projectmanager/com.example.sition.projectmanager.activities.ObjectActivity}: java.lang.RuntimeException: Parcelable encountered IOException reading a Serializable object (name = com.example.sition.projectmanager.TabButton)
           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262)
           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316)
           at android.app.ActivityThread.access$700(ActivityThread.java:158)
           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1296)
           at android.os.Handler.dispatchMessage(Handler.java:99)
           at android.os.Looper.loop(Looper.java:176)
           at android.app.ActivityThread.main(ActivityThread.java:5365)
           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:1102)
           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
           at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Parcelable encountered IOException reading a Serializable object (name = com.example.sition.projectmanager.TabButton)
           at android.os.Parcel.readSerializable(Parcel.java:2144)
           at android.os.Parcel.readValue(Parcel.java:2016)
           at android.os.Parcel.readListInternal(Parcel.java:2235)
           at android.os.Parcel.readArrayList(Parcel.java:1655)
           at android.os.Parcel.readValue(Parcel.java:1986)
           at android.os.Parcel.readMapInternal(Parcel.java:2226)
           at android.os.Bundle.unparcel(Bundle.java:223)
           at android.os.Bundle.getParcelable(Bundle.java:1173)
           at android.app.Activity.onCreate(Activity.java:930)
           at com.example.sition.projectmanager.activities.ObjectActivity.onCreate(ObjectActivity.java:102)
           at android.app.Activity.performCreate(Activity.java:5326)
           at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2225)
           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316) 
           at android.app.ActivityThread.access$700(ActivityThread.java:158) 
           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1296) 
           at android.os.Handler.dispatchMessage(Handler.java:99) 
           at android.os.Looper.loop(Looper.java:176) 
           at android.app.ActivityThread.main(ActivityThread.java:5365) 
           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:1102)               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
           at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.io.InvalidClassException: android.widget.RelativeLayout; IllegalAccessException
           at java.io.ObjectStreamClass.resolveConstructorClass(ObjectStreamClass.java:692)
           at java.io.ObjectStreamClass.newInstance(ObjectStreamClass.java:653)
           at java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1826)
           at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:787)
           at java.io.ObjectInputStream.readObject(ObjectInputStream.java:2013)
           at java.io.ObjectInputStream.readObject(ObjectInputStream.java:1970)
           at android.os.Parcel.readSerializable(Parcel.java:2142)
           at android.os.Parcel.readValue(Parcel.java:2016) 
           at android.os.Parcel.readListInternal(Parcel.java:2235) 
           at android.os.Parcel.readArrayList(Parcel.java:1655) 
           at android.os.Parcel.readValue(Parcel.java:1986) 
           at android.os.Parcel.readMapInternal(Parcel.java:2226) 
           at android.os.Bundle.unparcel(Bundle.java:223) 
           at android.os.Bundle.getParcelable(Bundle.java:1173) 
           at android.app.Activity.onCreate(Activity.java:930) 
           at com.example.sition.projectmanager.activities.ObjectActivity.onCreate(ObjectActivity.java:102) 
           at android.app.Activity.performCreate(Activity.java:5326) 
           at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097) 
           at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2225) 
           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2316) 
           at android.app.ActivityThread.access$700(ActivityThread.java:158) 
           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1296) 
           at android.os.Handler.dispatchMessage(Handler.java:99) 
           at android.os.Looper.loop(Looper.java:176) 
           at android.app.ActivityThread.main(ActivityThread.java:5365) 
           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:1102)
           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 
           at dalvik.system.NativeStart.main(Native Method) 

这是我的自定义RelativeLayout 类:

public class TabButton extends RelativeLayout implements Serializable {
    public TabButton(Context context) {
         super(context);
    }

    public TabButton(Context context, AttributeSet attrs) {
         super(context, attrs);
    }

    public TabButton(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
    }
}

还有我的 onSaveInstanceState 和 onRestoreInstanceState:

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putSerializable("CURRENT_OBJECT",currentObject);
    outState.putSerializable("TAB_BUTTONS", tabButtons);
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    currentObject = (Objectable) savedInstanceState.getSerializable("CURRENT_OBJECT");
    tabButtons = (ArrayList<TabButton>) savedInstanceState.getSerializable("TAB_BUTTONS");
}

我做错了什么?

最佳答案

您的概念是错误的:您不应该保存整个小部件,而应该保存重新创建它们的信息。

However, your activity might have more state information that you'd like to restore, such as member variables that track the user's progress in the activity.

来自:Android Activity Lifecycle, Android SDK Docs

因此,将信息保存为整数(在您的示例中用于标识所选选项卡)或其他基元,并在 onRestoreInstanceState 中设置。

关于java - 无法保存RelativeLayout的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35891049/

相关文章:

java - 在自由范围内生成吸血鬼数字

android - ResourceType 资源条目索引超出类型 entryCount

android - 在 Android 启动画面上显示 Toast

android - 包裹 : unable to marshal value - Fragments

java - Android Parcelable - 使用通用数据类型将数据读/写到 Parcel

java - android.os.TransactionTooLargeException : data parcel size NOUGAT ERROR

java - 获取 facebook 深层链接以在模拟器 facebook android 上工作

java - %f 在 Java 中是如何工作的

android - 使用矩阵在android中旋转和缩放图像

java - 散列和索引列表或数组?