为什么忽略此自定义视图属性?

时间:2016-05-09 14:46:57

标签: android android-layout android-databinding android-attributes

我正在尝试使用Data Binding Library为任何视图定义属性,如this 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>

此时,the layout caused a ClassNotFoundException when 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>

(该帖子没有提到它,但我必须按照Guide中的建议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方法。我确实在build文件夹中看到了生成的布局代码,但没有其他事情发生。

为什么我的BindingAdapter被忽略了?

3 个答案:

答案 0 :(得分:2)

我找到了问题的解决方案,我没有正确创建Binding:

遵循Guide的第一步,我使用DataBindingUtil.setContentView,但对于ListView项,您需要在ItemBinding.inflate&#39中使用Adapter ; 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());
}

答案 1 :(得分:1)

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

  

数据绑定布局文件略有不同,以布局的根标签开头,后跟数据元素和视图根元素。

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

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

可能需要进行绑定。我的意思是现在我瞄准盲目直到我实际测试这个。但是从那篇文章中我看到app:imageUrl='@{"http://example.com/image.jpg"}'

答案 2 :(得分:1)

应该是@BindingAdapter("bind:attribute")而不是@BindingAdapter("app:attribute")

并尝试使用它,它可能会有用。

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