3

我想在同一个活动中使用 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);

}
4

2 回答 2

5

创建 ViewBinding 是因为有些人使用 DataBinding 只是为了在 java/kotlin 代码中获取绑定类并使用引用(而不是使用数据字段直接在 xml 中设置值)。数据绑定包括 ViewBinding 所具有的所有内容,因此它并非旨在与 View 绑定一起工作。

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

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

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

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

如果您不想在 xml 中设置数据,只需使用 View Binding。

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

<data class="DataBindingName">
    </data>
于 2021-04-01T19:59:43.203 回答
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"
于 2021-06-04T12:24:01.717 回答