Android 数据绑定:包括强制 <layout> 标签?

Android Databinding: include forces <layout> tag?

我目前正在努力处理 <include> 布局和这些布局的强制性 <layout> 标签。

我有一个库,它定义了工具栏的布局,其他工件应该使用它,无论它们是否使用数据绑定。

要使数据绑定正常工作,工具栏的布局需要包裹在 <layout> 标记内。

因此我创建了两个不同的工具栏布局。

include_toolbar.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    .../>

我尝试重用定义的工具栏并用这样的布局标签包装它

include_toolbar_binding.xml:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <include
        android:id="@+id/wrapper"
        layout="@layout/include_toolbar"/>
</layout>

但这不起作用,因为这个包含需要再次包装,对吗?

是否有不需要在(包装的)绑定包含中再次定义工具栏的解决方案?

您应该考虑使用 <merge>

你的 toolbar.xml 看起来像这样:

<merge>
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        .../>
</merge>

来源:https://developer.android.com/training/improving-layouts/reusing-layouts.html

Android 不支持包含标签作为根。我不记得数据绑定是否支持在根目录中使用 include 标志的合并标签,但我不这么认为。你可以试试看。如果不支持,那只是数据绑定,因为 Android 通常支持它。

您可以使用:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android=...>
<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    .../>
</layout>

用于您的工具栏。然后您可以选择使用普通数据绑定加载器加载它:

IncludeLoaderBinding binding = IncludeLoaderBinding.inflate(inflater, ...);

或者您可以使用 non-data 绑定 inflation:

View included = inflater.inflate(...);

Android Data Binding 将正确剥离布局文件,以便可以在没有数据绑定的情况下使用它。如果您使用字符串标签,您可能会看到一些问题,因为它们被替换并且任何绑定表达式都将被删除。如果您使用的是您提到的普通布局,那么从数据绑定布局文件和 non-data 绑定布局文件中包含它不会有任何问题。

-- 编辑--

根据评论,我了解到有一个应用程序没有启用数据绑定,因此不支持。如果您希望通过数据绑定和支持 non-data 绑定项目获得对工具栏的现场访问权限,则此组合布局将不起作用。如果您不需要对工具栏的字段访问,您可以只包含来自数据绑定布局文件的 non-data 绑定布局文件。

结论:不能使用<include>作为根标签。 (如果 parent 是 <merge> 也不行)。 因此我需要分别在两种布局中定义工具栏。