如何恢复分离视图的状态

时间:2015-10-17 17:46:44

标签: android android-lifecycle

这是一个简单的项目:

activity_main.xml中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/add_some_layout_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add layout"/>

</LinearLayout>

some_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/edittext_container"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <EditText
        android:id="@+id/some_edittext"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Some hint"
        android:inputType="text"/>

</LinearLayout>

让我们考虑两种情况:

案例1:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final LinearLayout container = (LinearLayout) findViewById(R.id.container);

        final LayoutInflater layoutInflater = LayoutInflater.from(MainActivity.this);
        final View someLayoutWithEditText = layoutInflater.inflate(R.layout.some_layout, container, false);
        container.addView(someLayoutWithEditText);

        // button isn't used
    }
}

案例1的影响: EditText会在配置更改期间保留其文本。

案例2:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final LinearLayout container = (LinearLayout) findViewById(R.id.container);

        final LayoutInflater layoutInflater = LayoutInflater.from(MainActivity.this);
        final View someLayoutWithEditText = layoutInflater.inflate(R.layout.some_layout, container, false);

        Button addLayoutButton = (Button) findViewById(R.id.add_some_layout);
        addLayoutButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                container.addView(someLayoutWithEditText);
            }
        });
    }
}

案例2的效果我们在按钮上添加EditText点击=&gt;毕竟&#34;恢复部分&#34;已完成=&gt; EditText的状态尚未恢复

问题:如何在第二种情况下恢复EditText的状态?

1 个答案:

答案 0 :(得分:1)

您的状态恢复是在onRestoreInstanceState()方法中完成的,系统在onCreate之后调用它,因此如果您在恢复后添加视图,则状态将会丢失。

因此,如果您想保存视图的状态并手动恢复,而不是通过系统恢复,您可以执行下一步:

1)覆盖onSaveInstanceState()方法并在Bundle参数的EditText中保存值。 2)从bundle中获取它并将其手动设置为EditText。