0

我正在尝试使用Data Binding Library为任何视图定义一个属性,如此 Android Developers post中所述。

为此,帖子说首先需要一个带有封闭<layout>标签的布局:

<?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">
    <LinearLayout android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView android:id="@android:id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:attribute='@{"name"}'/>
    </LinearLayout>
</layout>

此时,布局引起了ClassNotFoundExceptionwhen inflated。我发现摆脱它的唯一方法是添加一个<data></data>节点,即使 Android 开发人员帖子中没有它:

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

(帖子没有提到它,但我必须按照指南中的建议启用dataBinding,然后才能构建。)build.gradle

该帖子然后解释了如何编写BindingAdapter处理属性的方法:

import android.databinding.BindingAdapter;
import android.util.Log;
import android.view.View;

public class AttributesBindingAdapter {
    @BindingAdapter("bind:attribute")
    public static void bindAttribute(View view, String attributeName){
        Log.e("PLN", attributeName);
    }
}

但是,该bindAttribute方法永远不会被调用。我确实在我的构建文件夹中看到了为布局生成的代码,但没有其他任何反应。

为什么我的 BindingAdapter 被忽略了?

4

3 回答 3

2

我找到了解决问题的方法,但我没有正确创建绑定:

按照指南的第一步,我使用了DataBindingUtil.setContentView,但对于ListView您需要ItemBinding.inflateAdapter's中使用的项目ViewHolder

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    ViewDataBinding binding = DataBindingUtil.inflate(
            LayoutInflater.from(parent.getContext()),
                    R.layout.item, parent, false);
    return new ViewHolder(binding.getRoot());
}
于 2016-05-11T14:12:58.893 回答
1

从我在第一个链接中可以看出,data标签是存在的。它可能在 G+ 帖子中被省略,因为它的样板。事实上,在文档中它说

数据绑定布局文件略有不同,以布局的根标记开始,然后是数据元素和视图根元素。

无论如何,我认为您可能在布局文件中缺少一些必需的糖。你能试一下吗:

app:attribute='@{"name"}`

也许它需要发生绑定。我的意思是现在我的目标是盲目的,直到我真正测试这个。但是从那个帖子我看到了app:imageUrl='@{"http://example.com/image.jpg"}'

于 2016-05-09T15:08:34.260 回答
1

它应该@BindingAdapter("bind:attribute")代替@BindingAdapter("app:attribute")

试试这个,它可能会奏效。

app:attribute="@{`name`}"
于 2016-05-10T10:10:36.860 回答