我想了解<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>
在这种情况下,我们有以下结果
让我们改变 titlebar.xml
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/some_text"
android:src="@drawable/chrome" />
结果真的很快。
让我们在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"
@+id/some_text
不再存在,现在我们已经@+id/bug
了。
让我们看一下结果
我在这里有一些问题:
我们可以在合并文件中使用任何属性(对于任何布局),但如果包含此部分的视图组(布局)(在我们的示例中为activity_main.xml)不具有此类属性,这种情况是如何解决的,只是忽略了,因为我们可以看到结果?
我们在imageview上面有一个硬编码的视图ID,如果id存在,它就可以工作,但如果它没有,我们可以在结果中看到它也被忽略
所以我已经写了很多。 总而言之,描述了XML解析器与merged和include标签完全一致的工作,同时最好知道XML解析器的源位置,以便查看它。
我将非常感谢读过这一行并能提出建议或给出建议的所有人。
提前谢谢。答案 0 :(得分:1)
如果<include>
标记同时包含layout_width和layout_height,它将覆盖所有根视图(包括它的文件)布局参数。
merge
是一种避免视图层次结构中额外深度的方法 - XML布局文件必须只有1个根 - 所以它必须只有一个View
,一个{{1} }可以包含其他ViewGroup
或View
。当您在<merge>
内包含多个View
s的布局时,您可能会在层次结构中添加额外的不必要的复杂性 - 例如,2个垂直方向的ViewGroup
可能不会需要。 LinearLayout
允许您移除额外的merge
,并将其ViewGroup
合并到包含它的View
中。
包含ViewGroup
一个merge
的布局与仅包含单个View
的布局相同,除了View
之外没有&{ #39; ta&#39; root view&#39;布局,所以merge
不会覆盖其布局参数(我相信)。
当include
或View
充气到ViewGroup
并且不支持子指定的布局参数时,参数就会被删除。包含或膨胀(使用布局填充物)时会发生这种情况。
如果将小孩ViewGroup
或View
添加到ViewGroup
(使用addView),则子项可能已分配了布局参数,如果它们不是与正在添加的ViewGroup
兼容,可能会在测量/布局期间导致类强制转换异常。
您的第二个问题与ViewGroup
布局规则有关,可以使用RelativeLayout