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

 niushenX 发布于 2023-02-12 16:43

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

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

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

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

    mEditText.setId((parentView.getId()+editTextPosition+someFinalNumber));
    

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

    mEditText.setId((this.getId()+someFinalNumber));
    

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

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

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

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

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

    更新

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

    2023-02-12 16:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有