Android-android id重名

Android-android id重名

偏爱自由 发布于 2017-07-16 字数 301 浏览 1085 回复 8

我在项目中用到两个XML布局文件,只有文件名称不同,文件中的内部控件所有ID都一样,居然在程序运行过程中没有出现预想中的错误.同一个ID对应多个控件实体,也能正常识别.求解释.(如果项目正式上线,我这么处理会不会带来暗藏的风险)
度娘和谷哥中关于这个ID重名问题,有解释:android够强大,支持这么用. 但原理是什么?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

归属感 2017-10-17 8 楼

可能是采用类似命名空间的处理方式,在不同的view中的控件是相互隔离的,他们被view这个“命名空间”隔离开来。当系统要调用这个控件的时候,先找到这个view,再去映射到具体的id。

如果你感觉对程序稳定带来威胁,可以这么解决这个问题:
在values新建立ids.xml,把id在这里声明:

<item type="id" name="right">false</item>
<item type="id" name="left">false</item>
<item type="id" name="middle">false</item>

在具体的文件中,直接@id/right就可以了

想挽留 2017-10-13 7 楼

不同的xml是可以重名的 你在加载xml的时候就已经决定你是用的哪一个xml的id
所以不会有问题

想挽留 2017-10-10 6 楼

个人认为这和允许两个不同.java文件中有相同命名的变量的原理是相似,所属名字空间不一样。除非你这两个xml文件有关联,比如一个include了另外一个,我想这时候是会编译报错的。

晚风撩人 2017-10-06 5 楼

不同xml之前有相同id,有这种情况,但是还没出错过

想挽留 2017-09-19 4 楼

会有问题,相同的 id 会导致状态保存和恢复出错(save instance state),比如你旋转屏幕进行 Activity 重构过程中会进行 View 的状态保存和恢复,而 View 的状态保存和恢复是根据其 id 进行唯一识别的,如果你多个 View 公用同一个 id ,那么在遍历保存这些 View 状态时只会实际保存最后一个 View 的状态,而恢复时,所有相同 id 的 View 都会和最后一个 View 的状态一样,具体的原因分析请参考我的博客:

关于-layout-重用导致的状态保存问题

甜柠檬 2017-09-13 3 楼

只要在同一棵节点树上,ID不重复就可以。
事件上,如果在同一棵节点树上ID重复了,lint工具是会有警告的:见http://tools.android.com/tips/lint-checks。
里面有这么一个lint检查项,如下:

DuplicateIncludedIds

Summary: Duplicate ids across layouts combined with include tags

Priority: 6 / 10
Severity: Warning
Category: Correctness

It's okay for two independent layouts to use the same ids. However, if layouts
are combined with include tags, then the id's need to be unique within any
chain of included layouts, or Activity#findViewById() can return an unexpected
view.

也就是,如果是两个独立的布局用同一个ID,是可以的。但是,如果是用include标签把它们联合起来的话,那么id就必须是唯一的。

想挽留 2017-07-26 2 楼

这个问题非常地容易理解:因为在Android的框架设计中,每一个控件都隶属于一棵控件树,每个控件都被其父控件所管理与调配,而根控件是一个容器控件,所有的子控件都是构造在这个根控件之上,这样并形成了一个控件树的控件域,在这个控件域中是不允许重名的,超出了这个控件域则这些控件的ID是无效的,也就是说在容器控件中的子控件是不允许重名的,而不在同一容器控件中的两个控件重名也无所谓。

想挽留 2017-07-26 1 楼

这个很好理解吗, 就是所谓命名空间的不一样。 可以理解为跟java中变量的作用域不一样的感觉。 我在一个 xml layout 文件中,经常写几个同样的id,有些看起来可能有点乱,不过当你很清楚的知道,他们在不同的节点,处于不同的层上面就完全没有问题。