2016-08-03 61 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”是否正常? –