Android 的 R.id 是否需要唯一?

Do Android's R.id need to be unique?

Android 的 R.id 是否必须是唯一的(到目前为止我一直保留它们)?

或者可以在不同的视图中重复使用 R.id 吗?

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

Any View object may have an integer ID associated with it, to uniquely identify the View within the tree. When the application is compiled, this ID is referenced as an integer, but the ID is typically assigned in the layout XML file as a string, in the id attribute.


In a relative layout, sibling views can define their layout relative to another sibling view, which is referenced by the unique ID.

An ID need not be unique throughout the entire tree, but it should be unique within the part of the tree you are searching (which may often be the entire tree, so it's best to be completely unique when possible).

不同布局使用相同的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 会导致异常

ID 用于在视图层次结构中查找视图。 Android 使用 depth-first search algorithm - 这意味着它会查找一个树枝的最底部,然后是另一个树枝等等。如果您有两个具有相同 ID 的视图,那么该算法将找到第一个视图并停止进一步搜索.

对ID的唯一性没有严格要求。例如,当您有一个列表视图时,该列表的每个项目都将使用相同的布局扩充,并且在大多数情况下将具有相同的共享 ID,这完全没问题。

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

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

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