<merge>标记如何在内部工作

时间:2015-05-07 11:12:22

标签: android xml android-layout merge

我想了解<merge>标记内部如何工作。我使用View Hierarchy工具研究了一些例子。所以我理解基本的使用方法以及它在更高层次上的工作原理,但我想更多地研究这个标签和一般的膨胀视图。
因此,让我们考虑一些简单的布局 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg"
    android:gravity="center_horizontal">

<include layout="@layout/titlebar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

<TextView android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/some_text"
    android:text="@string/hello"
    android:padding="10dp" />

</RelativeLayout>

当然还有 titlebar.xml

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

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/chrome" />
</merge>

在这种情况下,我们有以下结果 First

让我们改变 titlebar.xml

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/some_text"
    android:src="@drawable/chrome" />

结果真的很快。 enter image description here

让我们在activity_main.xml文件中进行更多更改。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg"
    android:gravity="center_horizontal">

<include layout="@layout/titlebar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

<TextView android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/bug"
    android:text="@string/hello"
    android:padding="10dp" />


    </LinearLayout>

titlebar.xml 中,我保留了所有内容。

所以在这种情况下,我们有一些奇怪的事情 1.现在我们的根布局是LinearLayout。我们在标题栏文件中指定了不存在的属性android:layout_below="@+id/some_text"

  1. 在同一行中,我们还有另一个问题@+id/some_text不再存在,现在我们已经@+id/bug了。 让我们看一下结果
  2. enter image description here

    我在这里有一些问题:

    1. 我们可以在合并文件中使用任何属性(对于任何布局),但如果包含此部分的视图组(布局)(在我们的示例中为activity_main.xml)不具有此类属性,这种情况是如何解决的,只是忽略了,因为我们可以看到结果?

    2. 我们在imageview上面有一个硬编码的视图ID,如果id存在,它就可以工作,但如果它没有,我们可以在结果中看到它也被忽略

    3. 所以我已经写了很多。 总而言之,描述了XML解析器与merged和include标签完全一致的工作,同时最好知道XML解析器的源位置,以便查看它。

      我将非常感谢读过这一行并能提出建议或给出建议的所有人。

      提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果<include>标记同时包含layout_width和layout_height,它将覆盖所有根视图(包括它的文件)布局参数。

merge是一种避免视图层次结构中额外深度的方法 - XML布局文件必须只有1个根 - 所以它必须只有一个View,一个{{1} }可以包含其他ViewGroupView。当您在<merge>内包含多个View s的布局时,您可能会在层次结构中添加额外的不必要的复杂性 - 例如,2个垂直方向的ViewGroup可能不会需要。 LinearLayout允许您移除额外的merge,并将其ViewGroup合并到包含它的View中。

包含ViewGroup一个merge的布局与仅包含单个View的布局相同,除了View之外没有&{ #39; ta&#39; root view&#39;布局,所以merge不会覆盖其布局参数(我相信)。

includeView充气到ViewGroup并且不支持子指定的布局参数时,参数就会被删除。包含或膨胀(使用布局填充物)时会发生这种情况。

如果将小孩ViewGroupView添加到ViewGroup(使用addView),则子项可能已分配了布局参数,如果它们不是与正在添加的ViewGroup兼容,可能会在测量/布局期间导致类强制转换异常。

您的第二个问题与ViewGroup布局规则有关,可以使用RelativeLayout

定义其行为