安卓数据绑定:包含强制<layout>标签?



我目前正在为布局的<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>

但这不起作用,因为这个include需要重新包装,对吧?

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

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数据绑定将正确剥离布局文件,以便在没有数据绑定的情况下使用。如果在替换字符串标记时使用字符串标记,并且任何绑定表达式都将被剥离,则可能会出现一些问题。如果您使用的是像您提到的那样的纯布局,那么从数据绑定布局文件和非数据绑定布局中都包含它不会有任何问题。

--编辑--

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

您应该考虑使用<merge>

你的工具栏.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

结论:不可能使用<include>作为根标记。(如果父对象是<merge>,则也不是)。因此,我需要在两种布局中分别定义Toolbar。

最新更新