与Android中的setId()方法混淆

时间:2012-06-04 11:30:27

标签: android view

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

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

public void setId(int id)

     

自:API Level 1

     

设置此视图的标识符。标识符不一定是   在此视图的层次结构中是唯一的。标识符应为正数   号。

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

2 个答案:

答案 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的第一个视图。