2

我已经定义了几个布局,其中很少有 id 是多重定义的。我很困惑它是如何工作的?为什么它不像我们在java代码中那样给出错误?最重要的是,环境如何决定它需要调用哪个组件?

我知道 id 生成过程是自动化的,它被添加到 R.java 例如,如果我们有相同的 ID,在两个 XML 中说“image1”,比如“layout1”和“layout2”。但在 R.java 中它不会有 2 个 ID。这意味着它一次只会引用 1 个组件。

如果我们必须在一个 Activity 中使用 2 个 XML,一个作为 activity.setcontentview(layout1),另一个作为 PopupWindow.setContentView(layout2)。在这种情况下会发生什么?

可能是它非常基本的问题,但我错过了什么吗?

4

3 回答 3

5

您可以findViewById将当前视图层次结构设置为活动。同一视图树中的视图不能具有相同的 id。(必须是唯一的)。

从文档中引用

任何 View 对象都可能有一个与之关联的整数 ID,以唯一标识树中的 View。编译应用程序时,此 ID 以整数形式引用,但 ID 通常在布局 XML 文件中作为字符串在 id 属性中分配。这是所有 View 对象(由 View 类定义)共有的 XML 属性,您将经常使用它。

http://developer.android.com/guide/topics/ui/declaring-layout.html

例子

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button myButton = (Button) findViewById(R.id.my_button);
 }

xml

  <Button android:id="@+id/my_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/my_button_text"/>  

这里

  Button myButton = (Button) findViewById(R.id.my_button);

findViewById是方法R.id.button是一个int值。将在 R.java 中有一个自动生成的条目。在当前视图树下的同一个 xml 文件下,您不能拥有具有相同 ID 的视图。

打开你的 R.java 不要修改它的内容。R.java 将如下所示

  public static final class id {
      public static final int my_button=0x7f080004; // this is the int value which is unique
   }

onCreate你提到喜欢R.id.my_button

您可以在不同的 xml 文件中拥有相同的 id,因为每当您使用findViewById()获取对布局的一部分的引用时,该方法只会在当前膨胀的布局中查找该视图。(当前视图树/层次结构)

但最好有唯一的 id 以避免混淆。

于 2013-07-24T04:53:00.273 回答
2

不同的 View 实例可以有相同的 ID。在以下情况下可能会出现这种情况:

ID 只是您可以用来查找视图的工具。在大多数情况下,它实际上是独一无二的,但不能保证。

于 2016-11-09T18:16:45.833 回答
1

对不同布局中的不同组件使用相同的 id 不会导致任何问题。但是你不能对相同布局中的不同组件使用相同的 id。每次创建一个新视图时都会为其分配一个唯一的整数 id,可以在 R.java 文件中找到它。但是即使我们使用相同的 id两个组件,R.java 文件中只有一个条目。但是,它不会导致错误,并且如果两个组件位于不同的 xml 布局中,这将有效。[http://developer.android.com/reference/android/view/View.html][1]

请在此页面中找到 ID 部分。抱歉,如果这不是您要找的

于 2013-07-24T05:25:10.250 回答