請考慮以下過於簡化的示例。我有一個LinearLayout
與項目列表(EditTexts
)。項目的數量在編譯時是未知的(例如,它可能是一個遊戲菜單屏幕,用戶剛剛選擇了玩家的數量,並且在這個屏幕上他們正在輸入每個玩家的名字)。保存和恢復一個佈局的多個版本狀態的正確方法
這樣做的一個顯而易見的方法是在xml中定義容器佈局(R.layout.list
),並在xml中定義單個項目佈局(R.layout.item
);分別
public class Main extends Activity {
private static final String FRAG_TAG = "ITEMS_FRAGMENT";
private static final int NUM_ITEMS = 3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = (LinearLayout) getLayoutInflater().inflate(R.layout.list, null, false);
for (int i = 0; i<NUM_ITEMS; i++) {
ll.addView(getLayoutInflater().inflate(R.layout.item, null, false));
}
setContentView(ll);
}
}
隨着R.layout.list
和R.layout.item
佈局:這將是這個樣子
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/list" />
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/item"
android:singleLine="true"/>
的問題是,在一個方向變化,事實上,所有的項目有相同的ID(R.id.item
)混淆了恢復過程。最終結果是,最後一個項目的狀態將恢復爲列表中的全部項目(即,如果最後一個項目的EditText
中包含「hi」,則每EditText
將在取向機會後具有「hi」 )。
在這個在我的代碼的情況下,每個項目都有一個CheckBox
,我可以得到一個isCheckboxChecked(LinearLayout list, int itemNumber)
功能依賴於每個項目都有ID爲R.id.checkbox
視圖中的事實狀態。有沒有一種合適的方法來執行視圖狀態恢復,它接受可能有多個項目從相同的XML資源中膨脹(因此將具有相同的ID)?
(ListView
不適合這種情況下,但它正確地處理這一點。它是如何正確地恢復狀態時,它的所有項目通常具有相同的ID?)
實際上,在'oncreate'中使用狀態不會完全起作用。對於複選框,您需要在'onRestoreInstanceState'中恢復,因爲視圖將在'onCreate' – njzk2 2016-05-26 15:19:41
@ njzk2之後恢復其狀態,謝謝,'onRestoreInstanceState'對於此更好。我更新了答案。 – 2016-05-27 06:42:49