好的,我感到困惑的是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,那么更改View
中getView
的内容不会导致偶然行为?
我的意思是,所有膨胀的视图都具有与布局中定义的相同的ID。
我的理解是,id在视图的上下文中是独一无二的。由于我是初学者,我要求澄清
所以,这意味着我不能通过使用相同的布局来扩充Fragment
中的两个Activity
。这将导致异常。两者都被相同的Activity
夸大,因此属于同一个实例。 ids会发生冲突
答案 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