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