您可以在同一个 activity 中使用 dataBinding 和 ViewBinding 吗?

Can you use dataBinding and ViewBinding in the same activity?

我想在同一个 activity 中使用 ViewBinding 和 DataBinding。如果这是可能的,你将如何在 activity?

中实现它?

这是我目前为止尝试过的方法,

@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 代码中获取绑定 class 并使用引用(而不是直接在 xml 中使用数据字段)。数据绑定包含 ViewBinding 的所有内容,因此它并非设计用于与 View 绑定一起工作。

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

生成 class MainLayoutBinding

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

很可能您想要两者的唯一原因是您不必将所有 xml 包装在 <layout>...</layout> 中并默认获得绑定,但就是这样让两个库并排工作并不值得付出一点努力。

如果你想在 xml 中设置数据,只需使用数据绑定,并将其作为标准做法将你所有的 xml 包裹在 <layout> 中,这样你就可以随时参考通过绑定 class.

到视图

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

但是如果你真的想这样做,我想你可以使用这个设置数据绑定名称:

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

当您使用数据绑定时,它会同时提供视图绑定数据绑定功能,所以像这样实现数据绑定

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"

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