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

Posted

技术标签:

【中文标题】在布局 xml 文件中使用包含时如何指定 id【英文标题】:How to specify id when uses include in layout xml file 【发布时间】:2010-12-18 01:30:13 【问题描述】:

在我的布局 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。

谁能帮我解决我的问题?

【问题讨论】:

您的 ID 缺少 @ 符号。 【参考方案1】:

&lt;include&gt;中指定ID

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

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

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

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

【讨论】:

此方法返回 test1View 对象的空值。 我看不出有什么区别,你能解释一下吗? 我发现如果我们包含的布局使用合并,这将无济于事。但在不使用合并的情况下,这是可行的。 @Zlatko 是的,即使在理论上,这也不能与 merge 一起使用,因为包含 merge 的结果不是单个视图,而是一堆视图。所以没关系。 这仅在不使用合并的情况下有效。如果合并,则无法按照此处指定:code.google.com/p/android/issues/detail?id=36918#c3【参考方案2】:

我发现,如果你在包含布局中使用&lt;merge&gt; 标签,那么包含的 ID 会转移到合并标签,这不是真实的视图。

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

托诺拜wrote:

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

【讨论】:

好一个。我删除了合并标签,它开始工作,但我的问题是,如果没有它的任何包含布局工作,合并标签的用途是什么?【参考方案3】:

Romain Guy indicates,您可以通过在 &lt;include&gt; 标记内放置 android:id 属性来覆盖包含布局的 ID。

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

【讨论】:

这是正确的。在包含的布局文件中引用根元素的方法是通过'include'标签中给出的id(除非没有给出)。 ID in = root 在包含布局中的 ID 在我看来,如果我先设置 id(在包含标签中,它会覆盖包含布局中的 id,对吗?),我将包含标签最初是 '@+id/ cell1' 然后 layout='@layout/workspace_screen' 将使用包含布局的 id 再次覆盖 android:id。 @Ron Romero 的回答对我来说更有意义。【参考方案4】:

我认为最佳答案忽略了最重要的一点,可能会误导人们认为&lt;include/&gt; 标签创建了一个包含包含内容的视图。

关键是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_
    android:layout_
    />

变成这样:

// activity_main.xml
<ImageView
    android:id="@+id/someid"
    android:layout_
    android:layout_
    />

【讨论】:

这是真的。这让我更清楚。谢谢。【参考方案5】:

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

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

【讨论】:

【参考方案6】:
    你必须设置id每个包含标签 包含的子元素集 新身份证。如果您查看如何生成新 id,请查看以下条目: https://***.com/a/15442898/1136117

【讨论】:

【参考方案7】:

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

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

<TextView
    android:id="@+id/txt_description"
    android:layout_
    android:layout_
    **android:layout_below="@+id/toolbar"**
    android:layout_marginTop="16dp"
    android:paddingLeft="8dp"
    android:paddingRight="8dp"/>

【讨论】:

【参考方案8】:

在使用&lt;RecyclerView&gt;的情况下,通过使用膨胀视图的实例找到&lt;include&gt;的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);
        
    

【讨论】:

【参考方案9】:

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

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

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        android:layout_
        android:layout_>

....
</LinearLayout>

或者

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

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

....
</LinearLayout>

【讨论】:

【参考方案10】:

当谈论包含时,您要么在包含的布局文件内的根视图上或在包含行本身上都有一个 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_
    android:layout_
    android:id="@+id/layout2">

</RelativeLayout>

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

【讨论】:

【参考方案11】:

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

【讨论】:

以上是关于在布局 xml 文件中使用包含时如何指定 id的主要内容,如果未能解决你的问题,请参考以下文章

如何识别可绘制的 xml 文件?

自定义字体和 XML 布局 (Android)

是否可以在 XML 中传递构造函数参数?

Android关于图片的处理

如何在 Android Studio 中查找使当前打开的布局文件膨胀的 Activity 或 Fragment

android: 一个新的 GUI 问题 - 如何声明 viewGroup,没有布局 XML 文件?