Android:在 featureModule 与库模块上导入资源

use*_*265 6 java android android-databinding dynamic-feature-module

应用程序结构

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
    }
}
Run Code Online (Sandbox Code Playgroud)

以上将导致未解决的引用错误,您可以通过使用全名而不是R.string.abc_test使用来解决该错误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>

Run Code Online (Sandbox Code Playgroud)

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

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

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