如何在不同的布局中使用重复的ID?

时间:2011-06-01 12:58:46

标签: android android-layout duplicates

我有两种不同的布局用于两种不同的活动。每个布局中都有一个具有相同ID的按钮:“@ + id / btnOK”。当我以编程方式为其中一个按钮设置属性时,我得到一个NullPointerException。但是当我更改其中一个ID时,一切都还可以。

我们不能在android中的不同布局中拥有重复的ID吗?

5 个答案:

答案 0 :(得分:23)

在“布局中的重复ID”主题中,从android developers

中提取

在创建RelativeLayout时,定义视图对象的ID非常重要。在相对布局中,兄弟视图可以相对于另一个兄弟视图定义其布局,该视图由唯一ID引用。

一个ID在整个树中不一定是唯一的,但它在您正在搜索的树的一部分中应该是唯一的 (通常可能是整个树,所以最好尽可能完全独特。

这意味着不同的布局可能会声明相同的ID,因为这不是最佳做法。

答案 1 :(得分:2)

我想在R.java类中会出现问题,因为此类将包含与每个View id对应的公共静态成员。

要使它工作,R.java类需要重命名其中一些id,然后你会如何找到它们?

答案 2 :(得分:2)

您可以使用相同的ID,但它应该采用不同的布局。相同的布局无法处理重复的ID。我已经采用了两个布局,因为你包含的按钮有“btn”。我在具有main.xml的Activity1中调用具有newxml.xml的Activity2。

这是我的代码:

main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Next" />

</LinearLayout>

活性1

setContentView(R.layout.main);

Button button=(Button) findViewById(R.id.btn);
button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Intent intent=new Intent(Activity1.this,Activity2.class);
            startActivity(intent);
        }
    });

newxml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button 
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Previous"/>

</LinearLayout>

活性2

setContentView(R.layout.newxml);

Button button=(Button) findViewById(R.id.btn);
button.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        finish();
    }
});

答案 3 :(得分:0)

我解决了这个问题,但我找不到原因。 在我的清单文件中,其中一个活动有“android:label =”@ string / app_name“。我删除了它并将其设置为我的主要活动。

上一个清单:

<activity android:name=".ui.ActLogin">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".ui.ActTest" android:label="@string/app_name">
</activity>

新清单:

<activity android:label="@string/app_name" android:name=".ui.ActLogin">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity android:name=".ui.ActTest">
</activity>

有人知道原因吗?

答案 4 :(得分:0)

在我看来,只要您正确地执行了操作,就可以使用重复的ID(有时很自然):代替Activity.findViewById()总是返回第一个匹配的视图,请使用ViewGroup.findViewById()ViewGroup可以是LinearLayoutFrameLayout等),它随视图组一起返回视图。

为避免棉绒警告:

  1. (首选)将ViewGroup的内容放在单独的布局XML中并使用

      <include layout="@layout/myLayout" android:id="@+id/specificId" />
    

    这样,您可以拥有多个布局相同且包含不同父ID(但子ID相同)的包含项,并且皮棉永远不会抱怨。

  2. 通过取消选中*Settings/Editor/Inspections*

  3. 中的框“ 单个布局中的重复ID ”来禁用项目的Lint警告