我试图使用数据绑定与自定义视图(可能的用法乔治山显示
here).
没有< 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:按应用: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> – 它的工作原理但我有额外的嵌套布局.
问题:合并attrs被忽略.有办法解决这个问题吗?
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. }