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是否需要唯一。以下是产生混淆的原因:
假设有一个
活动
,它有一个
文本视图
(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将发生冲突


不,碎片的工作方式不同。必须在fragments
onCreateView()方法中返回膨胀视图。因此,每个片段都必须膨胀视图,这导致有两个独立的视图对象。

为什么要使用
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()
方法的活动或视图的上下文中应该是唯一的吗?