我可以在Android的不同布局中使用相同的ID吗?


90

我是Android开发的新手。对图像使用相同的ID可以吗?TextViews不同的LayoutXML文件中可以?

当eclipse为我自动列出它们时,它将列出项目中的所有布局变量,因此会发生冲突吗?到现在为止,我还没有注意到在不同布局中使用相同ID会遇到任何问题,但从长远来看,我很担心。



@Pavel您仍然需要ID来调整约束。
萨达·侯赛因

Answers:


96

建议对不同的布局使用不同的ID。从长远来看,当您有很多布局并因此有很多id时,区分它们会变得非常复杂。

我通常会这样命名我的ID :layoutName_elementId

它对我来说很容易找到所需的ID,尤其是在使用自动完成功能时(我知道我在使用哪种布局,但我实际上并不知道ID;在这种情况下,根据我的命名策略,我只需输入版式名称,它就会显示该版式的所有ID)。

有关布局和ID的更多信息,请参见此处

编码愉快,


2
假设ok_button在您的每次活动中都有什么问题?如果您知道要查找的聊天,则自动补全功能会更加清晰。
Dan Chaltiel 2015年

132

简短的回答:是的,可以。

长答案:您可以这样做,因为每当使用findViewById()获取对布局的一部分的引用时,该方法仅在当前已放大的布局中查找该视图。因此,即使您在另一个布局中有另一个具有相同ID的视图,Android也不会在该视图中查找。


15
您能否给出更长的答案?因为R.id.layout_id是一个静态整数,并且是在编译时预先确定的,所以findViewById()不会知道当前已放大的布局。
Chloe 2013年

22
为了解决这个问题,我想回答Chloe的要求。每个视图的ID都相同,但在同一活动中永远不会出现两次。作为一个比喻,考虑一下如果我给你一堆纸,上面都带有数字,那会发生什么。其中几张纸上写有数字4。您正在看一张纸,我请您圈出4张纸。这很容易。现在,您将看到另一个带有4的工作表。您也可以找到并圈出它。预先定义数字并不重要。
Ted Cannelongo 2014年

6
我不同意Ted的评论,您可以同时在同一Activity上运行具有相同ID的两个组件。我在应用程序上遇到问题,我在主要活动中同时使用了两个不同的ViewPager。当我尝试检索当前使用ID显示的ViewPager时,实际上是检索了在后台运行的另一个。我通过简单地使两个ID唯一来解决了这个问题。
Yoann Hercouet '16

8
@YoannHercouet我相信这是因为两者都在同一张纸上(活动)
Naheel

22

根据开发人员API指南:

ID不必在整个树中都是唯一的,但它在要搜索的树的一部分内应该是唯一的(它可能通常是整个树,因此最好在可能的情况下完全唯一)。

因此,简短的答案是这不是强制性的,而是避免可能发生冲突的一种好习惯。


1
我曾经偶然地创建了相同的ID。取消对它们重新命名的工作量很大,因为所有实例均已重命名。这意味着一旦您有一个ID冲突,您就会被搞砸。再次将所有内容分开将是非常困难的。
t3chb0t

@ t3chb0t真实的!即使您选中“仅本地”,Android Studio也会重命名所有实例。这绝对是荒谬的。
约翰格伦

15

不建议这样做,因为如果将来您需要重构view id,Android Studio将在所有XML文件和类中对其进行重构,您会遇到麻烦。

但是在某些情况下,您确实需要使用它们id,例如,如果您有一些抽象并且重用了多个布局。

如果您的项目中有多个views同一个id's项目,并且需要重构,请手动进行,不要使用内置IDE功能,id在目标视图中更改XML布局内的布局,然后修复布局内的红色错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.