2 回答

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊
對(duì)于如何解決此問(wèn)題,您有兩種選擇:將代碼移動(dòng)到活動(dòng)生命周期中的不同點(diǎn)或更改 .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>標(biāo)記custom_edit_text.xml:
android:saveEnabled="false"
您為保存/恢復(fù)文本值而編寫(xiě)的代碼沒(méi)有任何問(wèn)題。但是,在 之后 onCreate(),Android 會(huì)自動(dòng)執(zhí)行自己的保存/恢復(fù)邏輯,這會(huì)覆蓋您所做的。
如果您將代碼從 移動(dòng)onCreate()到onRestoreInstanceState(),那么您的代碼將在 Android 自動(dòng)保存/恢復(fù)后運(yùn)行,因此您將“獲勝”?;蛘撸梢酝ㄟ^(guò)添加saveEnabled=false屬性來(lái)禁用自動(dòng)保存/恢復(fù)。
Android 的自動(dòng)保存/恢復(fù)不起作用的原因是它基于每個(gè)視圖的android:id屬性,并且您的EditText標(biāo)簽都具有相同的 id。這意味著所有四個(gè)值都使用相同的鍵保存,因此最后一個(gè)值會(huì)覆蓋所有先前的值。

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
所以這里發(fā)生的事情是,Android 也在為您的自定義EditText
實(shí)現(xiàn)處理狀態(tài)保存,這會(huì)覆蓋您的實(shí)現(xiàn)。由于您的CustomEdit
實(shí)例列表是動(dòng)態(tài)生成的,您可能不想依賴(lài) Android 來(lái)保存視圖的狀態(tài),因?yàn)樗鼈儧](méi)有唯一的 ID。
由于您的CustomEdit
膨脹custom_edit_text.xml
(將EditText
ID聲明為@+id/edit
),這意味著CustomEdit
您添加到布局中的每個(gè)都具有相同的內(nèi)部 ID EditText
- R.id.edit
。由于它們都具有相同的 ID,因此每個(gè)視圖都會(huì)將其狀態(tài)保存到該 ID,因此保存其狀態(tài)的最后一個(gè)將最終成為恢復(fù)狀態(tài)時(shí)應(yīng)用于所有視圖的文本。
您可以做兩件事來(lái)避免這種情況:
在你的
custom_edit_text.xml
,添加android:saveEnabled="false"
到EditText
。這將阻止View
保存that的狀態(tài)。這將是首選,因?yàn)樗苊饬俗霾槐匾墓ぷ鳌?/p>在
onRestoreInstanceState()
當(dāng)前正在恢復(fù)視圖狀態(tài)的位置執(zhí)行狀態(tài)恢復(fù)。
添加回答
舉報(bào)