2 回答

TA貢獻1847條經驗 獲得超7個贊
對于如何解決此問題,您有兩種選擇:將代碼移動到活動生命周期中的不同點或更改 .xml 的 xml 定義CustomEdit。
安卓生命周期
將此代碼移出onCreate():
CustomSave data = (CustomSave)getLastCustomNonConfigurationInstance();
if(data==null) return;
for(int i = 0; i<data.texts.size();i++){
addEdit(data.texts.get(i));
}
并將其放入onRestoreInstanceState():
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
CustomSave data = (CustomSave)getLastCustomNonConfigurationInstance();
if(data==null) return;
for(int i = 0; i<data.texts.size();i++){
addEdit(data.texts.get(i));
}
}
或者
XML 定義
將此屬性添加到文件中的<EditText>標記custom_edit_text.xml:
android:saveEnabled="false"
您為保存/恢復文本值而編寫的代碼沒有任何問題。但是,在 之后 onCreate(),Android 會自動執行自己的保存/恢復邏輯,這會覆蓋您所做的。
如果您將代碼從 移動onCreate()到onRestoreInstanceState(),那么您的代碼將在 Android 自動保存/恢復后運行,因此您將“獲勝”。或者,您可以通過添加saveEnabled=false屬性來禁用自動保存/恢復。
Android 的自動保存/恢復不起作用的原因是它基于每個視圖的android:id屬性,并且您的EditText標簽都具有相同的 id。這意味著所有四個值都使用相同的鍵保存,因此最后一個值會覆蓋所有先前的值。

TA貢獻2003條經驗 獲得超2個贊
所以這里發生的事情是,Android 也在為您的自定義EditText
實現處理狀態保存,這會覆蓋您的實現。由于您的CustomEdit
實例列表是動態生成的,您可能不想依賴 Android 來保存視圖的狀態,因為它們沒有唯一的 ID。
由于您的CustomEdit
膨脹custom_edit_text.xml
(將EditText
ID聲明為@+id/edit
),這意味著CustomEdit
您添加到布局中的每個都具有相同的內部 ID EditText
- R.id.edit
。由于它們都具有相同的 ID,因此每個視圖都會將其狀態保存到該 ID,因此保存其狀態的最后一個將最終成為恢復狀態時應用于所有視圖的文本。
您可以做兩件事來避免這種情況:
在你的
custom_edit_text.xml
,添加android:saveEnabled="false"
到EditText
。這將阻止View
保存that的狀態。這將是首選,因為它避免了做不必要的工作。在
onRestoreInstanceState()
當前正在恢復視圖狀態的位置執行狀態恢復。
添加回答
舉報