我有多个布局使用相同的按钮ID,在这种情况下是@ + id / button1,在运行时我会扩展布局并从给定视图中单独抓取每个按钮。第一个按钮抓得很好但是使用findViewById(从拥有的视图而不是活动调用)找不到相同给定ID的所有后续按钮。
检查调试器中的按钮显示后续按钮具有几乎相同的ID标记但增加1.如果预先存在ID的实例,则Android似乎不尊重XML文件给出的ID ..是这个案子呢?如果是这样,如何跨视图绑定按钮,我们是否需要为每个窗口小部件提供全局唯一ID?
答案 0 :(得分:2)
同一视图层次结构中同时存在的每个窗口小部件应具有唯一的ID值。换句话说,非常欢迎您在应用程序布局中重用@+id/button1
,但是将多个视图扩展到具有相同ID的同一层次结构可能会导致歧义。
这在某种程度上取决于你的实际布局是如何构建的,但是你可以做的另一件事就是从层次结构中的另一个视图调用findViewById()来解决一些歧义。例如,我可以像这样创建一个单一的布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:id="@+id/row_one"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Row One"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/row_two"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Row Two"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/row_three"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Row Three"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
注意所有按钮的ID值是否相同。为了获得对这些按钮的引用,我不能只从我的Activity中调用findViewById()
...我会得到哪一个?但是,可以从任何视图调用findViewById()
,因此我可以执行以下操作来获取对每个按钮的引用:
setContentView(R.layout.main);
Button one = (Button)findViewById(R.id.row_one).findViewById(R.id.button);
Button two = (Button)findViewById(R.id.row_two).findViewById(R.id.button);
Button three = (Button)findViewById(R.id.row_three).findViewById(R.id.button);
现在我有一个对每个唯一按钮的引用,即使它们具有相同的ID。话虽如此,如果您的应用程序与示例匹配,我仍然不提倡这样做。创建唯一ID引用有助于保持代码的可读性。
HTH!
答案 1 :(得分:0)
最终,每个按钮都有自己的static final int
,我们可以将其称为唯一ID,对吗?
是的,您应该为每个按钮指定自己的ID ...而且您不应该将按钮命名为button1
,button2
等等。