2014-10-12 57 views
1

請考慮以下過於簡化的示例。我有一個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.listR.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?)

回答

2

的Android商店通過與元素的ID相關聯的狀態。如果所有元素具有相同的ID,則與該ID相關聯的狀態將被恢復到具有該ID的所有元素。 LisView做得非常不同。它總是通過元素位置從Adapter中讀取值。因爲具有相同ID的視圖在列表中會有不同的位置,所以它們也會有不同的值。

如果你的情況你有幾個選項。

1)通過調用setId()方法將您的項目添加到LinearLayout之前,您需要指定不同的ID。您需要在Android資源中定義這些ID(例如<item type="id" name="item_01" />等)。

2)您需要覆蓋onSaveInstanceState(Bundle outState),瀏覽LinearLayout的子項並將其文本存儲到outState將文本與子項索引關聯的包中。然後在onRestoreInstanceState()中,您需要從savedInstanceState中讀取狀態並將它們設置爲相應的視圖。 3)您使用ListView,當用戶輸入文本時,適配器將數據(例如文件或數據庫)保留下來。當配置發生變化時,或在Activity的下一次啓動時,適配器將讀取這些存儲的值,並且它們將被正確恢復。

希望其中一個選項可以幫助你。

+0

實際上,在'oncreate'中使用狀態不會完全起作用。對於複選框,您需要在'onRestoreInstanceState'中恢復,因爲視圖將在'onCreate' – njzk2 2016-05-26 15:19:41

+0

@ njzk2之後恢復其狀態,謝謝,'onRestoreInstanceState'對於此更好。我更新了答案。 – 2016-05-27 06:42:49