在基础(应用)模块中显示动态特性模块的片段?

4
在我的基础模块(应用)中,我有几个片段。我想把其中一个放在动态特性模块中,并在需要时进行安装。在用户决定安装此模块之前,我只会显示一个空白占位符,而不是该片段。我知道如果它是来自动态特性模块的活动,那么这很容易实现,但我真的需要在我的基本模块活动中显示这个片段。
这种情况是否可能?
2个回答

5
您可以使用这种方式(Kotlin)
// example
val className: String
    get() = "$MODULE_PACKAGE.ui.login.LoginFragment"

fun instantiateFragment(className: String) : Fragment? {
    return try {
        Class.forName(className).newInstance() as Fragment
    } catch (e: Exception) {
        // not install feature module
        null
    }
}

1
我认为你需要确保在pro-guard中为该类添加一个keep规则,以避免混淆。 - Ahmed na
如果你的代码片段在模块内部被使用,那么你不需要添加保留规则,它已经被Proguard保留了。但如果是模块内未使用的Fragment,你就需要手动添加保留规则了。 - Công Hải
当我上传到Play Store时,这对我没有起作用。 我遇到了崩溃“Caused by: java.lang.ClassNotFoundException: com.myapp.customviewdynamicfeature.CustomFragment” - VIN
你是构建了APK还是AAB? - Công Hải

0
为了实现应用模块和功能模块之间的交互,可以使用依赖注入或服务定位器模式。应用程序可以找到特性模块的实现类并调用其公共API,在应用程序模块中返回片段实例,并将其加载到主活动的容器中。
例如:在应用程序中创建一个特性接口,在特性模块中创建相应的实现。然后定位/注入此实现类实例并调用其函数以获取片段引用。

我有一个功能模块,它依赖于应用程序模块,我可以访问:应用程序模块资源,但我需要打开:功能模块的片段,因为我无法访问:功能模块以避免循环依赖,我该怎么做? - Mahbub Munna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接