我有一个包含LinearLayout的Fragment,其中不同的项目根据某些业务逻辑而膨胀.这些项目中包含EditText.当我有多个具有不同内容的这些项目并且我分离/附加片段时,所有EditTexts以某种方式获得所有相同的文本.只有EditText在布局文件中具有id时才会发生这种情况.
为什么会这样?除了删除id之外还有其他方法可以防止这种情况吗?我想findViewById
在我的虚增项目上使用访问视图而不是容易出错getChildAt
.
我在https://github.com/rodja/EditTextValueProblem创建了一个简单的例子来演示这个问题
有一种不同的可能性,只需更改编辑文本的ID,例如,
mEditText.setId((parentView.getId()+editTextPosition+someFinalNumber));
或者,如果它是某个自定义布局中的EditText:
mEditText.setId((this.getId()+someFinalNumber));
这样,所有EditTexts都将具有不同的ID,并且文本将被正确恢复.
可以通过android:saveEnabled="false"
在EditTexts布局定义中设置来简单地修复它.当然,您需要确保自己保存/恢复内容.所以这是一个非直观的工作 - 但它适用于我的情况.尽管如此,整个事情看起来像是一个Android bug:
Android布局系统的一个很好的功能就是
在整个树中,ID不一定是唯一的[...]
如Android文档中所述.这使得代码和布局重用变得更加简单,并且被开发人员大量使用.我认为视图的保存/恢复实例状态实现使用视图的ID作为存储它的状态的键,因此它依赖于整个树中的唯一性.WTF?
更新
我添加了一个ListView
以在GitHub上的例子这表明,ListView
几乎可以肯定是使用了类似的解决办法,以防止EditTexts碰到这个问题.可以看出,输入到ListView内的EditText的文本不会自动恢复.