[英]Android data binding is not working with <merge> attributes
I'm trying to use databinding with custom views (a possible usage George Mount showed here ).我正在尝试将数据绑定与自定义视图一起使用(George Mount在这里展示了一个可能的用法)。
One can't imagine building compound views without <merge>
tag.无法想象没有
<merge>
标签构建复合视图。 However, in this situation databinding fails:但是,在这种情况下数据绑定失败:
MyCompoundView
class: 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}"
i hoped to control the visibility of the whole compound view 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>
The compiler errors:编译器错误:
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}').
I have all needed @BindingAdapter
methods.我都需要
@BindingAdapter
方法。 Now I inherit the view from FrameLayout
and use <RelativeLayout>
instead of <merge>
- and it works.现在我从
FrameLayout
继承视图并使用<RelativeLayout>
而不是<merge>
- 它可以工作。 But I have extra nested layout.但我有额外的嵌套布局。
Question: merge
attrs are ignored.问题:
merge
属性被忽略。 Is there any way to workaround that?有没有办法解决这个问题?
Android Studio 1.5.1 stable Android Studio 1.5.1 稳定版
Gradle plugin com.android.tools.build:gradle:1.5.0
Gradle 插件
com.android.tools.build:gradle:1.5.0
There is no merge object after inflation, so there is nothing to assign values to with a merge tag.膨胀后没有合并对象,所以没有什么可以用合并标签赋值的。 I can't think of any binding tag that will work on merge.
我想不出任何可以用于合并的绑定标签。
You can assign the tag to the root element and use the BindingAdapter to do what you want.您可以将标记分配给根元素并使用 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>
If you want to do something with the Binding class itself, you can use the DataBindingUtil to find the object from the View.如果你想对 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.
}
Actually you can use <merge>
tag inside <include>
and do data binding.实际上,您可以在
<include>
使用<merge>
标记并进行数据绑定。
Ex:前任:
incl_button.xml 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 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 ExampleFragment.kt
binding.layoutBtn.btn.setOnClickListener{
//...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.