Android Databinding:包含force <layout>标签?

时间:2017-01-11 17:16:02

标签: android xml android-layout include android-databinding

我目前正在努力处理<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>

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

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

3 个答案:

答案 0 :(得分:1)

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, ...);

或者您可以使用非数据绑定通胀:

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

Android数据绑定将正确剥离布局文件,以便可以在不使用数据绑定的情况下使用它。如果在替换字符串标记时使用字符串标记,并且将剥离任何绑定表达式,您可能会看到一些问题。如果你正在使用像你提到的普通布局,那么从数据绑定布局文件和非数据绑定布局文件中包含它都不会有任何问题。

- 编辑 -

根据我的评论,我了解到一个应用程序没有启用数据绑定,这不会得到支持。如果您希望通过数据绑定获取对工具栏的字段访问权限并支持非数据绑定项目,那么这种组合布局将无法正常工作。如果您不需要对工具栏进行字段访问,则可以只包含数据绑定布局文件中的非数据绑定布局文件。

答案 1 :(得分:0)

您应该考虑使用<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

答案 2 :(得分:0)

结论:无法使用<include>作为根标记。 (如果父母是<merge>),也不会。 因此,我需要分别在两个布局中定义工具栏。