Android视图id应该是唯一的吗?
好的,所以我感到困惑的是Android ID是否需要唯一。以下是产生混淆的原因:Android视图id应该是唯一的吗?,android,Android,好的,所以我感到困惑的是Android ID是否需要唯一。以下是产生混淆的原因: 假设有一个活动,它有一个文本视图(android:id=“text”)和一个按钮(android:id=“Button”)。按钮将文本视图的文本设置为随机文本。因此,要添加侦听器,我将检索按钮作为 Button b=(Button)查找dviewbyd(R.id.Button)然后添加监听器来完成任务。 现在,我可以从一个对话框片段、一个片段和一个不具有相同id的R.id.text引用这个相同的文本视图,毫无疑问,
假设有一个
活动
,它有一个文本视图
(android:id=“text”)和一个按钮
(android:id=“Button”)。按钮
将文本视图的文本设置为随机文本。因此,要添加侦听器,我将检索按钮作为Button b=(Button)查找dviewbyd(R.id.Button)
然后添加监听器来完成任务。现在,我可以从一个
对话框片段
、一个片段
和一个不具有相同id的R.id.text
引用这个相同的文本视图,毫无疑问,所有更改都将应用于这个文本视图
在子类化BaseAdapter
的情况下,您需要覆盖getView
,如果需要,您可以在其中进行充气,如果不需要,您可以进行更改。现在,以几乎相同的方式检索视图。差不多了。
您可以执行一个convertView.findViewById(..)
如果所有视图都需要一个唯一的id,那么在getView
中更改View
的内容如何才能不导致随意行为?
我的意思是,所有视图都具有布局中定义的相同id
我的理解是,ID在使其膨胀的视图上下文中是唯一的。由于我是初学者,我要求澄清
艾哈迈德回答后更新
因此,这意味着我不能使用相同的布局在活动
中膨胀两个片段
。这将导致异常。两者都由相同的活动
膨胀,因此属于同一实例。ID将发生冲突
执行convertView.findViewById(..)操作
如果所有视图都需要一个唯一的id,那么如何更改
getView中的视图内容不会导致随意行为
这是因为通过膨胀视图来创建视图的实例。在这种情况下,ID需要是唯一的。否则,您可能会得到一个ClassCastException
(如果两个不同类型的视图共享相同的Id)
不可能维护一个列表视图
,其中每一行都必须为其所有视图具有唯一标识符
所以,这意味着我不能在一个活动中膨胀两个片段
通过使用相同的布局。这将导致异常。两者都是
由于同一活动而膨胀,因此属于同一实例。这个
ids将发生冲突
不,碎片的工作方式不同。必须在fragmentsonCreateView()方法中返回膨胀视图。因此,每个片段都必须膨胀视图,这导致有两个独立的视图对象。为什么要使用android:id=“text”
?您应该使用android:id=“@+id/text”
或android:id=“@id/text”
,具体取决于您选择的方式。此外,getView
是相对于滚动的项目位置的,而不是ListView
中的项目位置
ID不必在整个树中都是唯一的,但在您正在搜索的树的部分中它应该是唯一的(通常可能是整个树,因此最好尽可能完全唯一)
这意味着,若您对所有视图使用相同的id,则不会有例外,但很明显,布局将变得无用
FindViewById只需遍历一棵树,直到找到具有搜索id的第一个元素并返回它(如果找不到,则返回null)。若在树中有几个id相同的元素,那个么总是会得到相同的元素,即树中第一个元素
您可能会有很多片段使用相同的布局进行充气,就像ListView中每个元素使用相同的布局一样,这是因为充气器不关心id值。
它只需读取XML文件并创建一个包含正确视图对象的树就行了。是的,我的错误就在这里。抱歉:)是的,id在特定区域是唯一的,即在ListView
项目中,当您为TextView
膨胀行id时,它与ImageView
的id不同。但是对于TextView
和ImageView
的每一行ID都是相同的。它们是不同的视图:)我已经尽可能简单地显示了;)当您使用@+id/
时,会收集id,并根据您仅使用R.id.text引用的项目,系统会选择您想要的项目id中的“@+id/”
的意义是什么?你能链接到文档吗?所以,我的理解是正确的。每个视图都有自己的ID集:)是的,ID集是相同的,只是每个视图都有不同的实例来修改视图。不会引发异常。对于Android来说,检查是否存在冲突ID的费用太高了。唯一的问题是,如果您使用findViewById()
搜索视图,您可能会收到带有该id的任何视图。因此,只要id在正在搜索的视图的子树中是唯一的,您就可以了。@AlexMDC是的,完全正确。你澄清了。如果ID相同,我将返回任何视图。:)“ID在使其膨胀的视图上下文中是唯一的”。您的意思是,如果要避免ID冲突,它们在调用其findViewById()
方法的活动或视图的上下文中应该是唯一的吗?