2013-07-24 27 views
2

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

我明白ID生成过程是自动的,它被添加到R.java 举例来说,如果我们有相同的ID,说“此搜索”两个XML,说“布局1” &“布局2”。但是在R.java中它不会有2个ID。这意味着它一次只能引用1个组件。

在情况下,我们必须使用2个XML一个活动,一个如activity.setcontentview(布局1)和另一作为PopupWindow.setContentView(布局2)。在这种情况下会发生什么?

可能是其非常基本的问题,但我失去的东西吗?

回答

5

可以设置到活动当前视图层次findViewById。您不能在同一个视图树中拥有相同的视图ID。 (必须是唯一的)。

从文档

任何视图对象可具有与其相关联的整数ID引用,以唯一地识别树内视图。在编译应用程序时,此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文件中使用相同的ids,因为无论何时使用findViewById()来获取对部分布局的引用,该方法只会在当前充气的布局中查找该视图。 (当前视图树/层次结构)

但最好有ID唯一,以避免混乱。

+0

够公平的,但他们如何在R.java中存储?他们没有重复 – Ankit

+0

@ ay89 R.java是自动生成的。你有一个条目用于添加在xml中的视图。在gen文件夹下打开'R.java'。你会发现自己的答案。您也可以通过添加一些示例或代码片段来编辑您的问题。 – Raghunandan

+0

@ ay89检查编辑过的帖子。我想它现在回答你的问题。 – Raghunandan

0

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

请在这个页面找到ID部分。对不起,如果这不是你要找的

1

不同的视图实例可以有相同的ID。这种情况可能发生在以下情况:

的ID仅仅是一个工具,你可以用它来找到意见。在大多数情况下它几乎是独一无二的,但不能保证。

相关问题