找不到我的绑定的inflate方法(使用Android,Data Binding。)

我正在使用数据绑定来绑定我的Android应用程序中的布局。

我已经设置了我的布局(my_custom.xml)并生成了绑定类(MyCustomBinding),但Android Studio似乎没有立即findBinding类的.inflate(…)方法,将其标记为错误(红色文字!)。

代码似乎是正确的,因为它编译和构建很好的APK。

如何让Android Studio正确更新?

代码示例:

这是我自定义的查看代码:

public class MyCustomView extends FrameLayout { public MyCustomView(Context context) { this(context, null, 0); } public MyCustomView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyCustomView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); MyCustomBinding binding = MyCustomBinding.inflate(inflater, this, true); binding.aButton.setText("Whatever"); } } 

布局定义为:

          

这是问题所在:(突出显示为红色)

在此处输入图像描述

Android Studio中没有完成,因为您实际上没有实现数据绑定。 将variables添加到布局的data元素后,将按预期findinflate方法。 也就是说,通过直接通过绑定设置文本字段的值,您实际上无法获得数据绑定的好处。 您应该在绑定中设置视图模型,然后让绑定相应地更新视图。 例如:

创建一个视图模型:

 public class MyViewModel { public final ObservableField name; public MyViewModel(String name) { this.name = new ObservableField<>(name); } } 

并在您的布局中使用它

 < ?xml version="1.0" encoding="utf-8"?>         

(注意data元素中声明的variable ,以及它在TextView的text属性中的引用方式)

然后在自定义视图中绑定两个:

 public class MyCustomView extends FrameLayout { public MyCustomView(Context context) { this(context, null, 0); } public MyCustomView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyCustomView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); MyCustomBinding binding = MyCustomBinding.inflate(inflater, this, true); MyViewModel model = new MyViewModel("Whatever"); binding.setModel(model); } } 

当然,通过自定义视图类中的setter传入数据或者甚至从容器视图传入数据可能会更好(请参阅http://developer.android.com/tools/data-binding/ guide.html #include )

您可以尝试为绑定布局设置自定义类名,并在自定义视图中引用它以使其清楚您使用的布局:

     

如果这不起作用,请使用DataBindingUtil而不是MyCustomBinding ,它返回基本DataBinding类并具有inflate()方法:

 MyCustomBinding binding = DataBindingUtil.inflate(inflater, this, true); 

来自文档 :

有时绑定不能提前知道。 在这种情况下,可以使用DataBindingUtil类创建绑定:

 ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater, layoutId, parent, attachToParent); ViewDataBinding binding = DataBindingUtil.bindTo(viewRoot, layoutId); 

你不需要那种types的东西,DataBinding在这里包含DataBindingUtils类。

 public MyCustomView(Context context, AttributeSet attrs, int defStyle){ super(context, attrs, defStyle); LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); MyCustomBinding binding = DataBindingUtil.inflate(inflater, this, true); binding.aButton.setText("Whatever"); }