安卓的R.id需要唯一吗?

5

Android中的R.id需要唯一吗(就像我迄今为止保持的那样)?

还是跨不同视图重复使用R.id没问题?


4
在不同的布局中使用相同的ID是可以的。 - M D
@MD 这应该是一个答案。 - IntelliJ Amiya
4个回答

9

ID用于在视图层次结构中查找视图。Android使用深度优先搜索算法,这意味着它会查找一个树枝的底部,然后查找另一个树枝等。如果您有两个具有相同ID的视图,则该算法将找到第一个视图并停止进一步搜索。

ID的唯一性没有严格要求。例如,当您拥有列表视图时,每个列表项将使用相同的布局进行填充,并且在大多数情况下将具有相同的共享ID,这是完全可以的。

记住这一点,如果您有两个(或更多)共享相同ID的视图,则应帮助Android选择正确的视图。为此,您首先需要搜索该视图的正确父级,然后再搜索该视图本身。

例如,如果您在两个不同的片段中有两个具有相同ID的视图,则应首先搜索片段容器视图,然后再搜索该容器内具有共享ID的视图。


3

在不同的布局中使用相同的ID是可以的。你可以在这里找到更多信息:http://developer.android.com/guide/topics/ui/declaring-layout.html

任何视图对象都可以有一个整数ID与之关联,以便在树中唯一标识该视图。当应用程序被编译时,该ID被引用为整数,但通常在布局XML文件中作为字符串分配给ID属性。


在相对布局中,兄弟视图可以定义它们相对于另一个兄弟视图的布局,该视图由唯一ID引用。

ID不必在整个树中唯一,但在您正在搜索的树部分内应该是唯一的(通常可能是整个树,因此最好尽可能完全唯一)。


2

可以在不同的布局中使用相同的id。

例如:

a.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.a);

b.java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.b);

a.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/id_rel"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="4dp"
 >

b.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/id_rel"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="4dp"
 >

但是在同一个布局中使用相同的id可能会导致异常


我认为异常会是 ClassCastException - Amar
2
View.findViewById 寻找 ID 的第一个 View,只要您仅访问第一个 View,它就不会导致 ClassCastException - kientux

1

大多数情况下,您可以在不同的布局中重复使用id。但是,您应该意识到通过使用标签或自定义组合视图以及添加到当前视图的列表项或片段来包含一个布局的可能性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接