2016-03-09 5 views
0

Я делаю приложение, в котором пользователь может добавить изображение к объекту, здесь я предоставляю пользователю выбор между выбором изображения из галереи или созданием нового с помощью камера. Оба этих параметра запускают Intent, который (после того, как пользователь сделал выбор изображения) возвращается к активности, из которой он пришел.Не удается сохранить состояние RelativeLayout

Но проблема в том, что когда пользователь возвращается, иногда некоторые данные этого действия теряются, поэтому я «перезагружаю» его, используя saveInstance. Одним из объектов, которые я пытаюсь сохранить, является arraylist пользовательских представлений, которые расширяют RelativeLayout. Но когда я загрузить данные следующие я получаю следующее сообщение об ошибке:

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

Что утра Я делаю неправильно?

ответ

1

Ваша концепция не правильная: вам не нужно сохранять все виджеты, но информация до воссоздает их.

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.

+0

Спасибо, я уже сомневался в методе, который использовал, но способ, который вы предложили, имеет гораздо больше смысла. –

 Смежные вопросы

  • Нет связанных вопросов^_^