你能在同一个活动中使用dataBinding和ViewBinding吗



我想在同一个活动中使用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);
}
创建ViewBinding是因为有些人使用DataBinding只是为了在java/kotlin代码中获得绑定类并使用引用(而不是使用数据字段直接在xml中设置值(。数据绑定包括ViewBinding所拥有的一切,因此它并不是为了与View绑定并行工作而设计的。

最大的问题是生成的类之间的命名冲突。ViewBinding和DataBonding都希望为布局main_layout.xml生成类MainLayoutBinding

现在可能有一种使用自定义命名的方法,但这并不值得,原因如下:

最有可能的是,您想要这两个库的唯一原因是,您不必将所有xml封装在<layout>...</layout>中,并在默认情况下获得绑定,但这只是一个很小的工作量,因此不值得让两个库同时工作。

如果您想在xml中设置数据,只需使用数据绑定,并将其作为一种标准做法,使用<layout>包装所有xml,这样您就可以始终通过绑定类引用视图。

如果您不想在xml中设置数据,只需使用视图绑定即可。

但如果你真的想这样做,我认为你可以使用以下方法设置数据绑定名称:

<data class="DataBindingName">
</data>

是的,您可以在同一项目中使用DataBinding和ViewBinding技术。您可以先从其中一种技术开始,然后根据需要实现另一种技术。它们无缝工作。如果你想要一个参考,你可以使用这个GitHub链接

当您使用数据绑定时,它将同时提供视图绑定数据绑定

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"