0

这是对该setId()方法的描述。

void  android.view.View.setId(int id)

公共无效 setId (int id)

自:API 级别 1

设置此视图的标识符。标识符在此视图的层次结构中不必是唯一的。标识符应该是一个正数。

我的问题是,尽管我们在 XML 文件中分配了唯一的 id,为什么标识符在这个视图的层次结构中不必是唯一的?

4

2 回答 2

4

我的问题是,尽管我们在 xml 文件中分配了唯一的 id,但为什么标识符在此视图的层次结构中不必是唯一的..?

android:id也不必在 XML 文件中是唯一的,尽管这通常是您编写它的方式。

要了解为什么小部件 ID 不需要唯一,请考虑ListView. 假设我们有ListView8 行。这些行中的每一行都是通过扩展布局 XML 资源(例如,android.R.layout.simple_list_item_1)来创建的。这些膨胀的行中的每一行都是ListView. 然而,由于这些行中的每一行都是从相同的布局资源中扩展而来的,因此每一行的小部件都具有与所有其他行相同的 ID。

这通常不是问题。它确实导致了 Android 开发的一个基本规则:总是调用findViewById()一些可以为你寻找的小部件提供独特结果的东西。在这种情况下,我不想调用或来findViewById()在其中一行中查找小部件,因为将有 8 个小部件都具有相同的 ID,而且我不知道我会取回哪一行的小部件。相反,我需要调用row ,以从该特定行获取特定小部件。ListViewActivityfindViewById()

于 2012-06-04T11:48:15.480 回答
2

ID 不必是唯一的,您可以使用任何您喜欢的正整数,但在这种情况下,可以有一些具有等效 ID 的视图。

也像 Romain Guy 在这篇文章中所说:

findViewById()深度优先搜索算法;它将返回它可以找到的指定 id 的第一个视图。

于 2012-06-04T12:01:13.400 回答