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

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

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

但是当我在模拟器中运行它,并启动层次结构查看器,每个布局仍然显示“NO_ID”,并在我的代码,我findViewById(R.id.test1)findViewById(R.id.test2)都返回空值。

任何人都可以请帮我解决我的问题吗?

<include>指定ID

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

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

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

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

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

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

Tor Norbye 写道 :

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

Romain Guy 表示 ,您可以通过在<include>标记中添加android:id属性来覆盖包含的布局的ID。

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

yes是这样的,但是当在include字段中插入的布局是一个自定义布局并且你想要访问那个根布局的时候要小心。 在这种情况下布局/testingtesting,实际上返回在第一行。

 test test1View = (test)findViewById(R.id.test1); 

我认为最重要的答案是最重要的一点,可能会误导人们认为<include/>标签创build了一个包含包含内容的View。

关键是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" /> 
  1. 您必须为每个包含标签设置ID
  2. 包含子元素设置一个新的ID。 如果你看看如何生成新的ID,看看这个条目: https : //stackoverflow.com/a/15442898/1136117

问题是我们尝试使用当前布局文件中未声明的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"/> 

比较

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

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

R.id.test1R.id.test2生成?

当谈到include时,你在包含的布局文件的根视图上或者在包含行上都有一个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声明为相同的布局。 所以你必须做的是select哪个元素将有id。

在使用<RecyclerView>的情况下,通过使用<RecyclerView>视图的实例find<include>的id,否则返回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); } }