<p>大家都知道,如果Activity被系统回收掉的时候,会调用onSaveInstanceState 方法为我们保存View的状态,以待重建时恢复。</p>
<p>那具体来说,我们需要做什么工作呢?
首先,为我们布局里面的需要保存状态的View们,指定唯一的id, 比如:
<pre><code>
<EditText
android:id="@+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入姓名" />
<EditText
android:id="@+id/etMobile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入手机号" />
<Button
android:id="@+id/btnShowPosition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show clickedPosition"
android:textAllCaps="false"/>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/mylist" />
</code></pre>
如果仅仅是保存以上view的值和状态, 指定id就足够了。
但是对于定义的一些变量,系统不会自动给你保存的。需要我们自己实现。
在Activity里面 我们定义了一个变量
clickedPosition
<pre><code>
private int clickedPosition = -1;
</code></pre>
用来记录点击listview的索引值。
每点击一个item,都会重新赋值。当系统被销毁的时候,我们需要保存这个变量值,我们需要重写onSaveInstanceState方法:
<pre><code>
@Override
protected void onSaveInstanceState(Bundle outState) {
Log.d(TAG, "---onSaveInstanceState( outState)---");
super.onSaveInstanceState(outState);
outState.putInt(KEY_CLICKED_POSITION, clickedPosition);
}
</code></pre>
在系统重建的时候,我们需要恢复这个变量,要重写onRestoreInstanceState 方法:
<pre><code>
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.d(TAG, "---onRestoreInstanceState( savedInstanceState)---");
super.onRestoreInstanceState(savedInstanceState);
clickedPosition = savedInstanceState.getInt(KEY_CLICKED_POSITION, -1);
}
</code></pre>
这样,重建后的Activity就获取到之前赋值的clickedPosition了。
网友评论