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()
当前正在恢复视图状态的位置执行状态恢复。
添加回答
举报