【问题标题】:How can I use duplicate IDs in different layouts?如何在不同的布局中使用重复的 ID?
【发布时间】:2011-09-06 06:55:45
【问题描述】:

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

真的不能在android的不同布局中有重复的ID吗?

【问题讨论】:

  • 发布您的代码和布局 - 您可以在不同的布局中有重复的 ID,所以这不是您的问题。
  • 我认为具有相同 ID 但布局不同的逻辑,
  • 你看过ids.xml资源文件吗?

标签: android android-layout duplicates


【解决方案1】:

关于“布局中的重复 ID”主题,摘自 android developers

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

ID 不必在整个树中是唯一的,但在您正在搜索的树的一部分中应该是唯一的(通常可能是整棵树,因此最好尽可能完全独一无二)。

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

【讨论】:

    【解决方案2】:

    我想R.java 类中会有问题,因为该类将具有对应于每个View id 的公共静态成员。

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

    【讨论】:

    • 这对我来说很有意义。
    【解决方案3】:

    您可以使用相同的 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);
            }
        });
    

    新xml

    <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();
        }
    });
    

    【讨论】:

      【解决方案4】:

      我解决了这个问题,但我没有找到原因。 在我的清单文件中,其中一个活动具有“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>
      

      有人知道原因吗?

      【讨论】:

        【解决方案5】:

        对我来说,使用重复的 id 看起来没问题(有时很自然),只要你正确地使用:而不是总是返回第一个匹配视图的 Activity.findViewById(),使用 ViewGroup.findViewById()ViewGroup 可以是 LinearLayoutFrameLayout 等),它返回带有视图组的视图。

        为了避免 lint 警告:

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

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

          通过这种方式,您可以拥有多个具有不同父 ID(但相同子 ID)的相同布局的包含,并且 lint 永远不会抱怨。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-07
          • 1970-01-01
          相关资源
          最近更新 更多