繁体   English   中英

Android 数据绑定无法使用<merge>属性

[英]Android data binding is not working with <merge> attributes

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

无法想象没有<merge>标签构建复合视图。 但是,在这种情况下数据绑定失败:

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 : 通过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_width="wrap_content"
        android:layout_height="wrap_content"
        app:isGone="@{!data.isViewVisible}">

        <ImageView
            android:id="@+id/image_image"
            android:layout_width="60dp"
            android:layout_height="60dp"
            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继承视图并使用<RelativeLayout>而不是<merge> - 它可以工作。 但我有额外的嵌套布局。

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

Android Studio 1.5.1 稳定版

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

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

您可以将标记分配给根元素并使用 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_width="wrap_content"
        android:layout_height="wrap_content">
        <ImageView
            app:isGone="@{!data.isViewVisible}"
            android:id="@+id/image_image"
            android:layout_width="60dp"
            android:layout_height="60dp"
            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.
}

实际上,您可以在<include>使用<merge>标记并进行数据绑定。

前任:

incl_button.xml

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

        <Button android:id="btn"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="Click"
         />

    </merge>
</layout>

fragment_example.xml

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

    </LinearLayout>
</layout>

ExampleFragment.kt

binding.layoutBtn.btn.setOnClickListener{
   //...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM