Android 数据绑定在不同模块中使用

ZY *_*ong 5 data-binding layout android module include

现在我有三个模块,模块A,B,C.模块A编译模块B,模块B编译模块C。模块C中有一个布局(layout_c.xml)。然后我在模块A的布局(layout_a)中使用layout_c.xml .xml)。

  1. 有 layout_c.xml `

    </variable>
    
    <variable
        name="handler"
        type="xxxxxx">
    
    </variable>
    
    Run Code Online (Sandbox Code Playgroud)

    <RelativeLayout
        ......
    </RelativeLayout>
    
    Run Code Online (Sandbox Code Playgroud)

    `

  2. 有 layout_a.xml

    <include android:id="@+id/layout_c" layout="@layout/layout_c"/>

  3. 问题:IDE 认为 bindingA.layoutC 返回的是视图而不是数据绑定。并且模块 C 具有 BR 类和所有数据绑定类。但是模块 A 没有。那么,我该怎么办?

    LayoutABinding bindingA = DataBindingUtil.setContentView(this,R.layout.layout_a); newTitleBarViewModel.setDataBinding(bindingA.layoutC);

Gen*_* Bo 5

为了让数据绑定在多个模块中工作 - 在我的例子中 - 我必须确保每个 Android Studio 模块(库、手机/平板电脑等)都在其对应的build.gradle (不仅仅是库 .gradle 中启用了数据绑定)文件,因为这还不够)

像这样:

android {
        ...

    defaultConfig {
        ...
    }
    buildTypes {
        ...
    }

    // Looks like this needs to be set in the app module that uses the lib
    // The lib needs it for the layout binding code there
    dataBinding {
        enabled = true
    }

}
Run Code Online (Sandbox Code Playgroud)

应用解决方案的项目结构:

  1. 有一个库模块和多个“应用程序模块” (也就是可以运行的手机或平板电脑的 Android Studio 模块),它们在同一项目中使用该库中的活动/布局

  2. 库项目在 /res/layout 下有 .xml 依赖于数据绑定,如下所示:

    <TextView
        android:id="@+id/display_name_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:text="@={user.displayName}"
        android:textSize="20sp"/>
    
    Run Code Online (Sandbox Code Playgroud)

这个解决起来有点棘手。特别是在我有多个模块的情况下。在我将这个解决方案应用于我正在使用的主模块后,我仍然继续遇到构建错误。最后,我注意到在所有错误输出中,还有 1 个其他模块(我没有使用过)也将库作为依赖项,但在build.gradle. 当最终确定并解决这个问题时,构建工作正常。 我很高兴发现了这一点,因为当您可以跨多个模块重用具有数据绑定的布局时,它会让事情变得更好