首页 > 解决方案 > Android:在 featureModule 与库模块上导入资源

问题描述

应用结构

featureModule = 应用插件:'com.android.dynamic-feature'

libraryModule = 应用插件:'com.android.library'

问题- 在功能模块中使用任何库资源都需要完整的包名限定符,这最终会给功能模块中的数据绑定生成的类带来问题。

描述- 我有这个上面的应用程序结构。当我尝试在任何 featureModule 中使用任何库资源时,它需要指定具有完整包名限定符的资源,因为默认情况下我将功能资源 R 作为主要导入。

所以对于任何 kotlin 类,让我们说活动代码看起来像这样

功能 1/TestActivity.kt

internal class TestActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityTestBinding = DataBindingUtil.setContentView(this, R.layout.activity_test)
        binding.testName.text = getText(R.string.abc_test) // this resource is present in core-lib module
    }
}

以上将导致未解决的引用错误,您可以通过使用 full-name so 而不是R.string.abc_testuse来解决com.blah.core-lib.R.string.abc_test

R.layout.activity_test

<layout xmlns:android="http://schemas.android.com/apk/res/android">


    <TextView
        android:id="@+id/test_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="@dimen/spacing_medium"
        android:text="@{@string/abc_test}" />
</layout>

但是对于 XML 数据绑定,它会产生更大的问题。由于R.layout.abc_test位于功能模块中,因此无法访问库资源。我可以通过使用实用程序类来解决这个问题,并让实用程序类返回带有完整包名称限定符的字符串,但是这个问题有点限制了数据绑定的许多特性,我不能直接在 XML 本身中使用资源。

PS:如果我将功能模块转换为库模块,这一切都很好。即使在代码级别,如果它是库模块,我最终也不会使用完整的包名限定符。

有没有人有更好的建议来解决功能模块的这个问题?

标签: javaandroidandroid-databindingdynamic-feature-module

解决方案


推荐阅读