Android View ID应该是唯一的吗?

时间:2013-08-05 20:47:04

标签: android

好的,我感到困惑的是Android ids是否需要是唯一的。这就是出现混乱的原因:
我们只是说Activity有一个TextView(android:id =“text”)和一个Button(android:id =“button”)。 Button将文本视图的文本设置为随机文本。因此,要添加一个监听器,我将检索 按钮作为
Button b = (Button) findViewById(R.id.button)然后添加监听器来完成任务 现在,我可以参考来自DialogFragment的{​​strong>相同 TextView,Fragment以及具有相同ID R.id.text的内容,并且所有更改都将被应用毫无疑问,这个文本视图。

如果要对BaseAdapter进行子类化,则需要覆盖getView,如果需要,可以在其中进行充气,如果没有,则进行更改。现在,您以几乎相同的方式检索Views。差不多。
你做convertView.findViewById(..)

如果所有观看次数都需要具有唯一ID,那么更改ViewgetView的内容不会导致偶然行为? 我的意思是,所有膨胀的视图都具有与布局中定义的相同的ID。

我的理解是,id在视图的上下文中是独一无二的。由于我是初学者,我要求澄清

艾哈迈德回答后的更新

所以,这意味着我不能通过使用相同的布局来扩充Fragment中的两个Activity。这将导致异常。两者都被相同的Activity夸大,因此属于同一个实例。 ids会发生冲突

3 个答案:

答案 0 :(得分:27)

documentation您可以阅读

  

整个树中的ID不一定是唯一的但在您要搜索的树的部分内它应该是唯一的(通常可能是整个树) ,所以最好尽可能完全独特。)

这意味着如果您对所有视图使用相同的ID,则不会有例外,但显然布局将变得无用。

FindViewById只需遍历一棵树,直到它找到具有搜索ID的第一个元素并返回它(如果找不到则返回null)。如果你在树中有很少的具有相同id的元素你将始终获得相同的元素,即树中第一个元素。

你可能有很多片段用相同的布局充气,就像你有ListView,每个元素都有相同的布局,这是因为inflater不关心id值。 它只是读取XML文件,并且不再创建具有正确视图对象的树。

答案 1 :(得分:2)

  

你做了一个convertView.findViewById(..)。

     

如果所有视图都需要具有唯一ID,那么如何更改   getView中的View内容不会导致偶然的行为?

这是因为您通过膨胀来创建视图的实例。在这种情况下,id必须是唯一的。否则,您可能会获得ClassCastException(如果两种不同类型的视图共享相同的Id)。

维护ListView是不可能的,其中每一行必须具有其所有视图的唯一标识符。

  

所以,这意味着我不能在一个Activity中膨胀两个片段   通过使用相同的布局。这将导致异常。两者都是   由相同的Activity膨胀,因此属于同一个实例。该   ids会发生冲突

不,片段以不同的方式工作。您必须在片段onCreateView()方法中返回膨胀的视图。因此每个片段都必须给视图充气,这会产生2个独立的视图对象。

答案 2 :(得分:2)

为什么使用android:id="text"?您应该使用android:id="@+id/text"android:id="@id/text",具体取决于您选择的方式。此外,getView是相对于滚动的项目位置而不是ListView