2016-08-03 59 views
0

我正在開發一個應用程序,用戶可以用照片和幾個是/否問題填寫表單。選擇「是」時,您需要在對話框中添加額外的信息。然後將此信息插入到TextView中,並將此TextView插入到LinearLayout中。onRestoreInstanceState不重新加載所有視圖

問題是,當用戶切換到另一個應用程序時,此屏幕會轉到後臺並被Android銷燬(因爲系統需要內存)。然後,當用戶返回到應用程序時,將調用onRestoreInstanceState()方法,從而帶回LinearLayout中的一些變量,但不包括TextView。我正在使用Android註釋來返回這些變量。我該如何恢復這些Android視圖?

<LinearLayout 
       android:id="@+id/estoque_zerado_pergunta_layout" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:visibility="visible"> 

       <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="@string/existe_estoque_zerado" 
        android:textSize="@dimen/abc_text_size_large_material" 
        android:layout_margin="5dp"/> 

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

        <RadioButton 
         android:id="@+id/radio_estoque_zerado_sim" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:text="@string/sim" /> 

        <RadioButton 
         android:id="@+id/radio_estoque_zerado_nao" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:checked="true" 
         android:text="@string/nao"/> 

       </RadioGroup> 

      </LinearLayout> 

      <LinearLayout 
       android:id="@+id/estoque_zerado_layout" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:visibility="gone" > 

       <LinearLayout 
        android:id="@+id/estoque_zerado_itens_layout" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:orientation="vertical" > 

        <!--Lista de itens aqui--> 

       </LinearLayout> 

       <LinearLayout 
        android:id="@+id/add_estoque_zerado_item" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:orientation="horizontal" 
        android:padding="5dp" > 

        <ImageView 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:paddingRight="10dp" 
         android:src="@drawable/ic_adicionar" 
         android:contentDescription="@string/adicionar_estoque_zerado"/> 

        <TextView 
         android:layout_width="wrap_content" 
         android:layout_height="match_parent" 
         android:gravity="center_vertical" 
         android:text="@string/adicionar_estoque_zerado" 
         android:textSize="@dimen/abc_text_size_medium_material" /> 

       </LinearLayout> 

      </LinearLayout> 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    Log.d("onRestoreInstanceState", "onRestoreInstanceState: chamou onRestoreInstanceState");} 

    @Override 
public void onSaveInstanceState(Bundle bundle) { 
    super.onSaveInstanceState(bundle); 
    Log.d("onSaveInstanceState", "onSaveInstanceState: chamou onSaveInstanceState");} 

對不起,我的初學者英語。 在此先感謝。

+0

你'機器人:知名度= 「水漲船高」'你的佈局是正常的嗎? –

+0

這是一個先決條件。每個問題只有在先前被回答之後纔會出現。 –

+0

你能確保你的linearLayout沒有被恢復?(通過使用[Hierarchy View](https://developer.android.com/studio/profile/hierarchy-viewer.html)爲例) –

回答

0

據我所知onRestoreInstanceState不會恢復你的意見。 onCreateonRestoreInstanceState使用相同Bundle所以初始化您的意見並檢查onCreate中的savedInstanceState。查看下面的文檔。

https://developer.android.com/reference/android/app/Activity.html#onRestoreInstanceState(android.os.Bundle)

https://developer.android.com/training/basics/activity-lifecycle/recreating.html#RestoreState

+0

「此方法的默認實現會執行先前由onSaveInstanceState(Bundle)凍結的任何視圖狀態的還原。」這是你給我的第一個鏈接,你可以訪問我的實例狀態。 並從同一頁面:「默認實現通過在具有ID的層次結構中的每個視圖上調用onSaveInstanceState(),並通過保存當前焦點視圖的ID來爲您處理大部分UI每個實例狀態(所有這些都通過onRestoreInstanceState(Bundle)的默認實現來恢復)。「這關於onSaveInstanceState。 –

+0

重點是,一些視圖被恢復,只有textview的內部linearlayout不會被恢復。 –

+1

測試了一些情況後,我將onRestoreInstanceState中的代碼更改爲onCreate,然後現在textview已經恢復。謝謝。 –

0

基於https://developer.android.com/training/basics/activity-lifecycle/recreating.html

你要救你想回去變量。 的onSaveInstanceState中保存你的數據

static final String SAVE_STRING = "string_to_save"; 
... 
@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    // Save variable value on bundle 
    savedInstanceState.putInt(SAVE_STRING, yourstring); 

    // Always call the superclass so it can save the view hierarchy state 
    super.onSaveInstanceState(savedInstanceState); 
} 

然後你可以檢索他們onRestoreInstanceState

public void onRestoreInstanceState(Bundle savedInstanceState) { 
    // Always call the superclass so it can restore the view hierarchy 
    super.onRestoreInstanceState(savedInstanceState); 

    // Restore state members from saved instance 
    yourstring = savedInstanceState.getInt(SAVE_STRING); 
} 
+0

我保存了我需要的所有變量,問題是textview在linearlayout內部。 –

+0

你有第二個LinearLayout的android:visibility =「gone」是否正常? –