小部件不尊重ID参数

时间:2011-11-03 21:25:35

标签: java android

我有多个布局使用相同的按钮ID,在这种情况下是@ + id / button1,在运行时我会扩展布局并从给定视图中单独抓取每个按钮。第一个按钮抓得很好但是使用findViewById(从拥有的视图而不是活动调用)找不到相同给定ID的所有后续按钮。

检查调试器中的按钮显示后续按钮具有几乎相同的ID标记但增加1.如果预先存在ID的实例,则Android似乎不尊重XML文件给出的ID ..是这个案子呢?如果是这样,如何跨视图绑定按钮,我们是否需要为每个窗口小部件提供全局唯一ID?

2 个答案:

答案 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 ...而且您不应该将按钮命名为button1button2等等。