这是对该setId()
方法的描述。
void android.view.View.setId(int id)
公共无效 setId (int id)
自:API 级别 1
设置此视图的标识符。标识符在此视图的层次结构中不必是唯一的。标识符应该是一个正数。
我的问题是,尽管我们在 XML 文件中分配了唯一的 id,为什么标识符在这个视图的层次结构中不必是唯一的?
我的问题是,尽管我们在 xml 文件中分配了唯一的 id,但为什么标识符在此视图的层次结构中不必是唯一的..?
android:id
也不必在 XML 文件中是唯一的,尽管这通常是您编写它的方式。
要了解为什么小部件 ID 不需要唯一,请考虑ListView
. 假设我们有ListView
8 行。这些行中的每一行都是通过扩展布局 XML 资源(例如,android.R.layout.simple_list_item_1
)来创建的。这些膨胀的行中的每一行都是ListView
. 然而,由于这些行中的每一行都是从相同的布局资源中扩展而来的,因此每一行的小部件都具有与所有其他行相同的 ID。
这通常不是问题。它确实导致了 Android 开发的一个基本规则:总是调用findViewById()
一些可以为你寻找的小部件提供独特结果的东西。在这种情况下,我不想调用或来findViewById()
在其中一行中查找小部件,因为将有 8 个小部件都具有相同的 ID,而且我不知道我会取回哪一行的小部件。相反,我需要调用row ,以从该特定行获取特定小部件。ListView
Activity
findViewById()
ID 不必是唯一的,您可以使用任何您喜欢的正整数,但在这种情况下,可以有一些具有等效 ID 的视图。
也像 Romain Guy 在这篇文章中所说:
findViewById()
是深度优先搜索算法;它将返回它可以找到的指定 id 的第一个视图。