为什么Android会使用相同的ID更改EditTexts的值?

Rod*_*dja 20 android view android-edittext android-fragments

我有一个包含LinearLayout的Fragment,其中不同的项目根据某些业务逻辑而膨胀.这些项目中包含EditText.当我有多个具有不同内容的这些项目并且我分离/附加片段时,所有EditTexts以某种方式获得所有相同的文本.只有EditText在布局文件中具有id时才会发生这种情况.

为什么会这样?除了删除id之外还有其他方法可以防止这种情况吗?我想findViewById在我的虚增项目上使用访问视图而不是容易出错getChildAt.

我在https://github.com/rodja/EditTextValueProblem创建了一个简单的例子来演示这个问题

Rod*_*dja 26

可以通过android:saveEnabled="false"在EditTexts布局定义中设置来简单地修复它.当然,您需要确保自己保存/恢复内容.所以这是一个非直观的工作 - 但它适用于我的情况.尽管如此,整个事情看起来像是一个Android bug:

Android布局系统的一个很好的功能就是

在整个树中,ID不一定是唯一的[...]

Android文档中所述.这使得代码和布局重用变得更加简单,并且被开发人员大量使用.我认为视图的保存/恢复实例状态实现使用视图的ID作为存储它的状态的键,因此它依赖于整个树中的唯一性.WTF?

更新

我添加了一个ListView在GitHub上的例子这表明,ListView几乎可以肯定是使用了类似的解决办法,以防止EditTexts碰到这个问题.可以看出,输入到ListView内的EditText的文本不会自动恢复.


Mik*_*eps 8

有一种不同的可能性,只需更改编辑文本的ID,例如,

mEditText.setId((parentView.getId()+editTextPosition+someFinalNumber));
Run Code Online (Sandbox Code Playgroud)

或者,如果它是某个自定义布局中的EditText:

mEditText.setId((this.getId()+someFinalNumber));
Run Code Online (Sandbox Code Playgroud)

这样,所有EditTexts都将具有不同的ID,并且文本将被正确恢复.

  • [View.generateViewId()](https://developer.android.com/reference/android/view/View#generateViewId()) 已在 API 级别 17 中添加,用于以编程方式创建视图 id。我相信也有 ViewCompat 版本。 (2认同)