我定义了几个布局,其中很少有id是多个定义的。我很困惑它是如何工作的?为什么它不像我们进入java代码那样给出错误?最重要的是,环境如何决定它需要调用哪个组件?
我理解id生成的过程是自动化的,它被添加到R.java中 例如,如果我们有相同的ID,在两个XML中说“image1”,请说“layout1”& “布局2”。但在R.java中它不会有2个ID。这意味着它一次只会引用一个组件。
如果我们必须在Activity中使用2个XML,一个作为activity.setcontentview(layout1),另一个作为PopupWindow.setContentView(layout2)。在这种情况下会发生什么?
可能是它非常基本的问题但是我错过了什么?
答案 0 :(得分: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
中,您可以引用findViewById()
。
您可以在不同的xml文件中使用相同的ID,因为每当您使用{{1}}获取对布局的一部分的引用时,该方法仅在当前虚增的布局中查找该视图。 (当前视图树/层次结构)。
但是,为了避免混淆,最好使用ID。
答案 1 :(得分:1)
对不同布局中的不同组件使用相同的ID不会导致任何问题。但是你不能在同一个布局中为不同的组件使用相同的id。每次创建一个新的视图时,都会为它分配一个唯一的整数id,可以在R.java文件中找到..但即使我们使用相同的id两个组件,只有一个条目进入R.java文件。但是,它不会导致错误,如果两个组件都在不同的xml布局中,则此方法有效。 [http://developer.android.com/reference/android/view/View.html] [1]
请在此页面中找到ID部分。对不起,如果这不是你想要的
答案 2 :(得分:1)
不同的View实例可以具有相同的ID。在以下情况下可能会出现这种情况:
ID只是您可以用来查找视图的工具。它在大多数情况下几乎是独一无二的,但不能保证。