我正在尝试使用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文件夹中看到了生成的布局代码,但没有其他事情发生。
答案 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`}"