125

在我的布局 xml 文件中,我包含了其他布局 xml 文件(每个都有不同的 android id)。

<include layout="@layout/view_contact_name" android:id="+id/test1"/>
<include layout="@layout/view_contact_name" android:id="+id/test2"/>

但是当我在模拟器中运行它并启动 Hierarchy Viewer 时,每个布局仍然显示“NO_ID”,并且在我的代码中,我有 findViewById(R.id.test1)并且findViewById(R.id.test2)两者都返回 null。

谁能帮我解决我的问题?

4

11 回答 11

306

在 ID 中指定<include>

<include layout="@layout/test" android:id="@+id/test1" />

然后使用两个findViewById来访问布局中的字段

View test1View = findViewById(R.id.test1);
TextView test1TextView = (TextView) test1View.findViewById(R.id.text);

使用这种方法,您可以访问您拥有的任何包含中的任何字段。

于 2010-09-22T17:36:11.020 回答
66

我发现,如果您<merge>在包含布局中使用标签,则包含的 ID 会转移到合并标签,这不是真实视图。

所以要么删除合并,要么用一些布局替换它。

托诺拜写道

标签不是真实的<include>视图,所以 findByView 不会找到它。@id 属性(以及您在包含标签上设置的任何其他属性)改为应用于包含布局的根标签。所以你的 activity.getView(R.id.included1) 实际上应该是<TextView>它本身。

于 2014-01-13T08:57:49.380 回答
40

Romain Guy表示您可以通过在标签内放置一个android:id属性来覆盖包含的布局的 ID <include>

<include android:id="@+id/cell1" layout="@layout/workspace_screen" />
于 2009-11-19T00:01:56.897 回答
19

我认为最佳答案错过了最重要的一点,可能会误导人们认为<include/>标签创建了一个包含包含内容的视图。

关键是include的id传递到include的布局文件的根视图。

这意味着:

// activity_main.xml
<include layout="@layout/somelayout" android:id="@+id/someid"/>

// somelayout.xml
<?xml version="1.0" encoding="utf-8"?>
<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />

变成这样:

// activity_main.xml
<ImageView
    android:id="@+id/someid"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
于 2017-03-14T12:41:27.597 回答
4

是的就是这样,但是当包含字段中插入的布局是自定义布局并且您想要访问该根布局时要小心。在这种情况下,@layout/test test 的布局实际上是在第一行返回的。

test test1View = (test)findViewById(R.id.test1);
于 2012-02-08T14:44:52.047 回答
2

在使用通过使用膨胀视图的实例<RecyclerView>查找 id 的<include>情况下,否则它将返回null

public class ViewHolder extends RecyclerView.ViewHolder {

        private mTextView;

        public ViewHolder(View view) {
            super(view);
            View include_1 = view.findViewById(R.id.include_1);
            mTextView = (TextView) include_1.findViewById(R.id.text_id);
        }
    }
于 2017-07-17T14:34:23.540 回答
2
  1. 您必须为每个包含标签设置 id
  2. 包含的子元素设置一个新的 id。如果您查看如何生成新 id,请查看此条目: https ://stackoverflow.com/a/15442898/1136117
于 2015-10-13T12:13:10.667 回答
2

问题是我们尝试使用当前布局文件中未声明的 id。无需再次声明,可以使用 id 来简单地引用 id @+id/。如果您通过 Android Studio 重构原始 id 名称,它也会在包含的布局中重构。

<include layout="@layout/toolbar"/>

<TextView
    android:id="@+id/txt_description"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    **android:layout_below="@+id/toolbar"**
    android:layout_marginTop="16dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"/>
于 2016-08-12T18:17:47.337 回答
1

如果您已将 id 设置为包含布局的任一根标记,那么您可以使用该 id 或者您可以将 id 设置为包含布局。

但是你不能同时设置 id 可能会抛出异常。

<include layout="@layout/view_contact_name" android:id="+id/test1"/>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>

或者

<include layout="@layout/view_contact_name"/>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:id="@+id/llBottomMainView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

....
</LinearLayout>
于 2020-04-08T16:34:24.710 回答
0

在谈论包含时,您要么在包含的布局文件内的根视图上有一个 id,要么在包含行本身上有一个 id,而不是两者都有。例如:

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

布局 1 文件

<RelativeLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/layout2">

</RelativeLayout>

上面的示例是错误的,因为从技术上讲,您为相同的布局声明了两个 id。所以你要做的就是选择哪个元素有id。

于 2016-11-23T17:29:41.127 回答
-2

哇,我不敢相信这个问题还没有正确的答案。简单的标签很烂。您只能更改以不匹配开头的android:layout_内容。android:id所以答案是你不能。对不起。你可以做的是创建一个类,它将是一个 ViewGroup,它将膨胀内部包含的视图,然后将其作为标签添加到你的布局中,但仅此而已。

于 2020-05-05T04:13:39.593 回答