你能在同一个Activity中同时使用dataBinding和ViewBinding吗?

4

我希望在同一个Activity中使用ViewBinding和DataBinding,如何实现?

目前我尝试了以下方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    ActivityMainBinding viewBinding = ActivityMainBinding.inflate(getLayoutInflater();
    View view = viewBinding.getRoot();
    setContentView(view)

    ActivityMainBinding  dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

}

5
我想在同一个Activity中使用ViewBinding和DataBinding -- 为什么?DataBinding提供了与ViewBinding相同的所有功能。因此,如果您已经为项目启用了DataBinding,只需使用DataBinding即可。 - CommonsWare
我看到了这两者之间的区别,感觉在已经建立了数据绑定之后再创建视图绑定有点傻。顺便说一句,我在 StackOverFlow 上看到了你很多的回答,我觉得你能在我的问题上发表评论很酷。 - Shawn
2
“在已经建立了数据绑定之后,创建视图绑定似乎有点愚蠢”--这是一个构建性能问题。数据绑定需要更长的时间来生成类。对于大型项目,这可能是一个问题。相比之下,视图绑定类的生成成本较低,有些项目仅使用数据绑定来生成绑定类(而不是用于绑定表达式、双向绑定等)。感谢您的好评! - CommonsWare
3个回答

8
ViewBinding的出现是因为一些人仅仅是想在java/kotlin代码中获取绑定类并使用引用(而不是直接在xml中使用数据字段设置值),所以他们使用了DataBinding。DataBinding包含了ViewBinding所有的功能,因此它不是为了与ViewBinding并行设计的。
最大的问题是生成类之间的命名冲突。ViewBinding和DataBinding都希望为布局“main_layout.xml”生成类“MainLayoutBinding”。
现在可能有一种使用自定义命名的解决方法,但这真的不值得,原因如下:
你想同时使用两者的最可能唯一原因是,你不想将所有xml都包装在“...”中,并默认获取绑定,但这只需要付出很少的努力,因此让两个库共存并没有太大意义。
如果你想在xml中设置数据,只需使用Data Binding,并养成一个标准习惯,将所有xml都包装在中,这样您就可以始终通过绑定类引用视图。
如果你不想在xml中设置数据,只需使用View Binding。
但是,如果你真的想这么做,我认为你可以使用以下代码设置Data Binding名称:
<data class="DataBindingName">
    </data>

1

是的,您可以在同一项目中使用DataBinding和ViewBinding技术。您可以最初从其中任何一种技术开始,然后在需要时实现另一种技术。它们可以无缝地协同工作。如果您需要参考资料,可以使用此GitHub链接


0

当您使用数据绑定时,它将提供视图绑定数据绑定功能,因此请按照以下方式实现数据绑定

android {
  buildFeatures {
  dataBinding true
   }
 }

 <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
    name="viewmodel"
    type="com.myapp.data.ViewModel" />
</data>

</layout>


val dataBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)
dataBinding.executePendingBindings()
dataBinding.tvName.text="Your Name"

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