Android 数据绑定不适用于 <merge> 属性

Posted

技术标签:

【中文标题】Android 数据绑定不适用于 <merge> 属性【英文标题】:Android data binding is not working with <merge> attributes 【发布时间】:2016-06-06 01:28:29 【问题描述】:

我正在尝试将数据绑定与自定义视图一起使用(George Mount 展示了here 的可能用法)。

无法想象没有&lt;merge&gt; 标签的复合视图。但是,在这种情况下,数据绑定会失败:

MyCompoundView类:

public class MyCompoundView extends RelativeLayout 

MyCompoundViewBinding binding;

public MyCompoundView (Context context, AttributeSet attrs) 
    super(context, attrs);
    init(context);


private void init(Context context)
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    binding = MyCompoundViewBinding.inflate(inflater, this, true);

my_compound_view.xml: by app:isGone="@!data.isViewVisible" 我希望控制整个复合视图的可见性

<?xml version="1.0" encoding="utf-8"?>

<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >

    <data>
        <variable name="data" type="com.example.MyViewModel"/>
    </data>

    <merge
        android:layout_
        android:layout_
        app:isGone="@!data.isViewVisible">

        <ImageView
            android:id="@+id/image_image"
            android:layout_
            android:layout_
            app:imageUrl="@data.imagePhotoUrl"/>

         <!-- tons of other views-->

    </merge>

</layout>

编译器错误:

Error:(13) No resource identifier found for attribute 'isGone' in package 'com.example'
Error:(17, 21) No resource type specified (at 'isGone' with value '@!data.isViewVisible').

我已经有了所有需要的@BindingAdapter 方法。现在我从FrameLayout 继承视图并使用&lt;RelativeLayout&gt; 而不是&lt;merge&gt; - 它可以工作。但我有额外的嵌套布局。

问题: merge attrs 被忽略。有没有办法解决这个问题?

Android Studio 1.5.1 稳定版

Gradle 插件com.android.tools.build:gradle:1.5.0

【问题讨论】:

最好使用 而不是 @Rakeeb Rajbhandari,是的,数据绑定在&lt;include&gt; 标签上工作正常。但是,这并不能解决膨胀自定义视图时额外视图组的问题。 请看我的问题。我正在使用包含标签和内部类。 ***.com/q/45143721/5214893 【参考方案1】:

膨胀后没有合并对象,所以没有什么可以用合并标签赋值。我想不出任何可以用于合并的绑定标签。

您可以将标记分配给根元素并使用 BindingAdapter 来做您想做的事情。

<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >

    <data>
        <variable name="data" type="com.example.MyViewModel"/>
    </data>

    <merge
        android:layout_
        android:layout_>
        <ImageView
            app:isGone="@!data.isViewVisible"
            android:id="@+id/image_image"
            android:layout_
            android:layout_
            app:imageUrl="@data.imagePhotoUrl"/>
         <!-- tons of other views-->
    </merge>
</layout>

如果你想对 Binding 类本身做一些事情,你可以使用 DataBindingUtil 从 View 中找到对象。

@BindingAdapter("isGone")
public static void setGone(View view, boolean isGone) 
    ViewDataBinding binding = DataBindingUtil.findBinding(view);
    //... do what you want with the binding.

【讨论】:

Android 开发者在documentation 中提到了它 你能用一些代码详细说明你的建议吗?谢谢你:) 您好,我无法让合并标签工作。它显示错误Element merge is not allowed here。见:pastebin.com/QhQKYN71 这里,merge is not allowed here 只是一个警告,但它是 a known bug【参考方案2】:

其实你可以在&lt;include&gt;里面使用&lt;merge&gt;标签进行数据绑定。

例如:

incl_button.xml

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

        <Button android:id="btn"
             android:layout_
             android:layout_
             android:text="Click"
         />

    </merge>
</layout>

fragment_example.xml

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

    <LinearLayout
        android:layout_
        android:layout_>

        <include
            layout="@layout/incl_button"
            android:id="@+id/layout_btn" />

    </LinearLayout>
</layout>

ExampleFragment.kt

binding.layoutBtn.btn.setOnClickListener
   //...

【讨论】:

以上是关于Android 数据绑定不适用于 <merge> 属性的主要内容,如果未能解决你的问题,请参考以下文章

XAML 绑定不适用于依赖属性?

模型绑定不适用于嵌套对象

BigQuery MERGE 查询不适用于空的 REPEATED 字段

淘汰赛中的数据绑定不适用于多个属性

Angular 数据绑定不适用于 async/await,但它适用于 Promise

Bootstrap 多选不适用于剔除绑定