27

好的,我感到困惑的是Android ids是否需要是唯一的。这就是为什么会出现混淆:
假设有一个Activity有一个TextView(android:id =“text”)和一个Button(android:id =“button”)。将Button文本视图的文本设置为随机文本。所以,要添加一个监听器,我将检索按钮
Button b = (Button) findViewById(R.id.button),然后添加监听器来完成任务。
现在,我可以从 a 、 a和不具有相同 id 的内容中引用相同的 TextView ,并且毫无疑问,所有更改都将应用于此文本视图。 DialogFragmentFragmentR.id.text

在 subclassing 的情况下BaseAdapter,如果需要,您需要覆盖进行getView膨胀的位置,如果没有,则进行更改。现在,您以几乎相同的方式检索Views。几乎。
你做一个convertView.findViewById(..).

如果所有视图都需要有一个唯一的 id,那么更改 not 的内容如何View导致getView随意的行为?
我的意思是,所有膨胀的视图都具有与布局中定义的相同的 id。

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

艾哈迈德回答后更新

所以,这意味着我不能通过使用相同的布局来Fragment膨胀两个。Activity这将导致异常。两者都膨胀了相同的Activity,因此属于同一个实例。id 会冲突

4

3 回答 3

33

文档中您可以阅读

ID 不必在整个树中是唯一的,但它应该在您正在搜索的树的一部分中是唯一的(这通常可能是整棵树,因此最好尽可能完全唯一)。

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

FindViewById 的工作原理是遍历一棵树,直到找到具有搜索到的 id 的第一个元素并返回它(如果没有找到,则返回 null)。如果您在树中有几个具有相同 id 的元素,您将始终获得相同的元素,即树中第一个元素。

您可能有大量使用相同布局充气的片段,就像您拥有每个元素具有相同布局的 ListView 一样,这是因为充气机不关心 id 值。它只是读取 XML 文件并创建具有正确视图对象的树而已。

于 2013-08-05T21:31:47.863 回答
2

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

如果所有视图都需要有一个唯一的 id,那么在 getView 中更改 View 的内容如何不会导致随意的行为?

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

不可能维持ListView每行都必须为其所有视图具有唯一标识符的位置。

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

不,片段以不同的方式工作。您必须在 Fragments 方法中返回一个膨胀的视图onCreateView()。所以每个片段都必须膨胀视图,这会导致有 2 个单独的视图对象。

于 2013-08-05T20:54:09.690 回答
2

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

于 2013-08-05T20:54:24.700 回答