如何在布局xml文件中使用时指定id

hap*_*497 111 android android-layout

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

<include layout="@layout/view_contact_name" android:id="+id/test1"/>
<include layout="@layout/view_contact_name" android:id="+id/test2"/>
Run Code Online (Sandbox Code Playgroud)

但是,当我在模拟器中运行它,并开始层次查看器,每个布局仍显示"NO_ID",并在我的代码,我 findViewById(R.id.test1)findViewById(R.id.test2)两个返回null.

有人可以帮我解决我的问题吗?

Ron*_*ero 279

在中指定ID <include>

<include layout="@layout/test" android:id="@+id/test1" />
Run Code Online (Sandbox Code Playgroud)

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

View test1View = findViewById(R.id.test1);
TextView test1TextView = (TextView) test1View.findViewById(R.id.text);
Run Code Online (Sandbox Code Playgroud)

使用该方法,您可以访问任何包含的任何字段.

  • 我发现,如果我们包含的布局使用合并,这将无济于事.但是如果不使用合并,这是有效的. (29认同)
  • 此方法为test1View对象返回null值. (17认同)
  • 我真的没有看到差异,你能解释一下吗? (4认同)

小智 59

我发现,如果你<merge>在include布局中使用tag,那么include的ID会转移到merge标签,而这不是真实的视图.

因此要么删除合并,要么用一些布局替换它.

Tor Norbye 写道:

<include>标签是不是一个真正的观点,所以findByView不会找到它.@id属性(以及您在include标记上设置的任何其他属性)将应用于所包含布局的根标记.所以你的activity.getView(R.id.included1)实际上应该是<TextView>它自己.

  • 好的.我删除合并标签,它开始工作,但我的问题是合并标签的用法是什么,如果任何包括布局工作没有它? (3认同)

Dan*_*sky 34

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

<include android:id="@+id/cell1" layout="@layout/workspace_screen" />
Run Code Online (Sandbox Code Playgroud)


And*_*ano 11

我认为最佳答案错过了最重要的一点,并可能误导人们认为<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"
    />
Run Code Online (Sandbox Code Playgroud)

变成这样:

// activity_main.xml
<ImageView
    android:id="@+id/someid"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    />
Run Code Online (Sandbox Code Playgroud)