为了账号安全,请及时绑定邮箱和手机立即绑定

Android的<merge>标签在XML布局中的用途是什么?

/ 猿问

Android的<merge>标签在XML布局中的用途是什么?

至尊宝的传说 2020-02-04 15:51:27

我已经阅读了Romain Guy在<merge />标记上的帖子,但是我仍然不明白它的用处。它是<Frame />标签的某种替代品,还是这样使用:


<merge xmlns:android="....">

<LinearLayout ...>

    .

    .

    .

</LinearLayout>

</merge>

那么<include />代码在另一个文件中?


查看完整描述

3 回答

?
九州编程

<merge/> 之所以有用,是因为它可以摆脱不需要的ViewGroup,即仅用于包装其他视图且本身没有任何作用的布局。


例如,如果<include/>要从另一个文件中进行布局而不使用合并,则这两个文件可能看起来像这样:


layout1.xml:


<FrameLayout>

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

</FrameLayout>

layout2.xml:


<FrameLayout>

   <TextView />

   <TextView />

</FrameLayout>

在功能上等效于以下单个布局:


<FrameLayout>

   <FrameLayout>

      <TextView />

      <TextView />

   </FrameLayout>

</FrameLayout>

layout2.xml中的那个FrameLayout可能没有用。 <merge/>帮助摆脱它。这是使用合并的样子(layout1.xml不变):


layout2.xml:


<merge>

   <TextView />

   <TextView />

</merge>

这在功能上等效于以下布局:


<FrameLayout>

   <TextView />

   <TextView />

</FrameLayout>

但是由于您正在使用<include/>,因此可以在其他地方重复使用布局。它不必用于仅替换FrameLayouts -您可以使用它来替换不会为视图的外观/行为添加任何有用内容的任何布局。


查看完整回答
反对 回复 2020-02-04
?
交互式爱情

包含标签

该<include>标签可让您将布局划分为多个文件:它可以帮助处理复杂的或超长用户界面。


假设您使用两个包含文件来分割复杂的布局,如下所示:


top_level_activity.xml:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/layout1" 

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >


    <!-- First include file -->

    <include layout="@layout/include1.xml" />


    <!-- Second include file -->

    <include layout="@layout/include2.xml" />


</LinearLayout>

然后,您需要编写include1.xml和include2.xml。


请记住,包含文件中的xml只是在渲染时转储到top_level_activity布局中(非常类似于#INCLUDEC 的宏)。


包含文件是纯简布局xml。


include1.xml:


<?xml version="1.0" encoding="utf-8"?>

<TextView xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/textView1"

    android:text="First include"

    android:textAppearance="?android:attr/textAppearanceMedium"/>

...和include2.xml:


<?xml version="1.0" encoding="utf-8"?>

<Button xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/button1"

    android:text="Button" />

看到?没有什么花哨。请注意,您仍然必须使用声明android名称空间xmlns:android="http://schemas.android.com/apk/res/android。


因此,top_level_activity.xml的呈现版本 为:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/layout1" 

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >


    <!-- First include file -->

    <TextView

        android:id="@+id/textView1"

        android:text="First include"

        android:textAppearance="?android:attr/textAppearanceMedium"/>


    <!-- Second include file -->

    <Button

        android:id="@+id/button1"

        android:text="Button" />



</LinearLayout>

在您的Java代码中,所有这些都是透明的:findViewById(R.id.textView1)在您的活动类中,返回正确的小部件(即使该小部件是在与活动布局不同的xml文件中声明的)。


最重要的是:可视化编辑器可以轻松处理事情。顶层布局呈现与包含的XML。


情节变厚

由于包含文件是经典布局xml文件,因此它必须具有一个top元素。因此,如果您的文件需要包含多个控件,则必须使用一种布局。


假设include1.xml现在有两个TextView:必须声明一个布局。让我们选择一个LinearLayout。


include1.xml:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/layout2" 

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >


    <TextView

        android:id="@+id/textView1"

        android:text="Second include"

        android:textAppearance="?android:attr/textAppearanceMedium"/>


    <TextView

        android:id="@+id/textView2"

        android:text="More text"

        android:textAppearance="?android:attr/textAppearanceMedium"/>


</LinearLayout>

该top_level_activity.xml将呈现为:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/layout1" 

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >


    <!-- First include file -->

    <LinearLayout 

        android:id="@+id/layout2" 

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:orientation="vertical" >


       <TextView

            android:id="@+id/textView1"

            android:text="Second include"

            android:textAppearance="?android:attr/textAppearanceMedium"/>


       <TextView

            android:id="@+id/textView2"

            android:text="More text"

            android:textAppearance="?android:attr/textAppearanceMedium"/>


   </LinearLayout>


     <!-- Second include file -->

   <Button

        android:id="@+id/button1"

        android:text="Button" />


</LinearLayout>

但是等两个级别LinearLayout都是多余的!


确实,嵌套的两个LinearLayout没有任何作用,因为TextView可以layout1为完全相同的呈现将两个嵌套在下面。


所以,我们能做些什么?


输入合并标签

该<merge>标签只是一个虚拟标签,它提供一个顶级元素来处理这种冗余问题。


现在include1.xml变为:


<merge xmlns:android="http://schemas.android.com/apk/res/android">


    <TextView

        android:id="@+id/textView1"

        android:text="Second include"

        android:textAppearance="?android:attr/textAppearanceMedium"/>


    <TextView

        android:id="@+id/textView2"

        android:text="More text"

        android:textAppearance="?android:attr/textAppearanceMedium"/>


</merge>

现在top_level_activity.xml呈现为:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/layout1" 

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >


    <!-- First include file --> 

    <TextView

        android:id="@+id/textView1"

        android:text="Second include"

        android:textAppearance="?android:attr/textAppearanceMedium"/>


    <TextView

        android:id="@+id/textView2"

        android:text="More text"

        android:textAppearance="?android:attr/textAppearanceMedium"/>


    <!-- Second include file -->

    <Button

        android:id="@+id/button1"

        android:text="Button" />


</LinearLayout>

您保存了一个层次结构级别,避免了一个无用的观点:Romain Guy已经睡得更好了。


你现在不快乐吗?


查看完整回答
反对 回复 2020-02-04
?
精慕HU

blazeroni已经很清楚了,我只想补充几点。

  • <merge> 用于优化布局,用于减少不必要的嵌套。

  • 当将包含<merge>标签的布局添加到另一个布局中时,将<merge>删除该节点,并将其子视图直接添加到新的父视图中。


查看完整回答
反对 回复 2020-02-04

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信