安卓:setVariable(BR.xyz, model)和databinding.setXYZ(model)之间有什么区别?

16

我正在研究Android数据绑定,发现我们可以通过以下两种方式设置模型:

 User user = new User("User", "Abc"); // this is a model
dataBinding.setVariable(BR.user, user);
dataBinding.executePendingBindings(); // and we have to do this... Why?

我们还可以设置如下:

binding.setUser(user);

有人能解释一下这两者之间的区别吗?

用户模型:

public class User{
public String fName;
public String lName;

public User(String fName, String lName){
this.fName = fName;
this.lName = lName;
   }
}
3个回答

17
考虑这样一种情况,当你有一个抽象类时,它没有共同的绑定布局(除了所有绑定布局都继承自超类ViewDataBinding):
public abstract classs EditorActivityFragment<T extends ViewDataBinding> {

在这个类的onCreateView()方法中,由于除了ViewDataBinding没有通用超类,所以您将无法使用任何生成的方法将变量设置到绑定中,因此您将被迫使用反射,或者您可以使用方便的方法setVariable()
binding.setVariable(BR.viewModel,myViewModel);

我希望这有助于更好地阐明此方法的使用案例。

11

它们做相同的事情。根据文档,有时变量的类型无法确定,因此您需要使用setVariable()方法。在正常情况下,会生成setX()方法(或方法集)。最好使用生成的方法。


0

如果有人仍然不清楚,这里是官方文档的链接。 文档链接 - 点击这里

以下是@JarettMillard分享的文档摘录。

boolean setVariable (int variableId, 
            Object value)

在Binding类中设置一个值。

通常,开发人员可以直接调用子类的set方法。例如,如果Binding中有一个变量x,则会生成一个setX方法。但是,有时候无法确定ViewDataBinding的具体子类,因此无法通过反射发现生成的方法。setVariable调用允许在不使用反射的情况下设置变量的值。

更多参考资料请查看官方文档链接

override fun onBindViewHolder(holder: BindingHolder, position: Int) {
   item: T = items.get(position)
   holder.binding.setVariable(BR.item, item);
   holder.binding.executePendingBindings();
}

这在你没有访问特定绑定类但有更通用版本(例如ViewDataBinding,它类似于所有绑定的基类)时非常有用。在这种情况下,您可以使用此方法设置属性,例如上面我们为项变量使用的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接