android - 具有相同ID的多个组件如何在android中工作?

标签 android

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

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

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

这可能是一个非常基本的问题,但我是否遗漏了什么?

最佳答案

您可以将当前 View 层次结构的findViewById 设置为 Activity 。同一 View 树中的 View 不能具有相同的 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 中有一个条目。在当前 View 树下的同一 xml 文件下,您不能拥有具有相同 ID 的 View 。

打开你的 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() 获取对布局的一部分的引用时,该方法只会在当前的 View 中查找该 View 膨胀的布局。 (当前 View 树/层次结构)

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

关于android - 具有相同ID的多个组件如何在android中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17825356/

相关文章:

来自 CursorWindow 的 Android SQLIte 错误 : Couldn't read row 0, col 1

android - 在android中将相机预览拉伸(stretch)到全屏

Android开发云数据库

android - Xamarin - 在 Glide Xamarin 中使用 AsBitmap()

java - 如何使用Android的Camera2 API

Android:设备屏幕不会与最新的 android 系统 WEBVIEW 超时

android - 如何在Ubuntu中自动升级android studio

SD 卡中的 Android Widget

android - ClassCastException:android.support.v4.graphics.drawable.DrawableWrapperHoneycomb 无法转换为 android.graphics.drawable.LayerDrawable

android - Android fragment 问题