You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EmptyFragmentActivity已转为internal,如何实现Hilt测试用的launchFragmentInHiltContainer?

解决FragmentScenario.EmptyFragmentActivity无法访问的问题

由于FragmentScenario.EmptyFragmentActivity被改为internal权限,原launchFragmentInHiltContainer实现因无法访问该类及其常量报错,以下是修正后的完整方案:

步骤1:创建自定义Hilt测试Activity

先定义一个空的Activity用于承载测试Fragment,并用Hilt注解标记:

@AndroidEntryPoint
class HiltTestActivity : AppCompatActivity()

同时在debug目录的AndroidManifest.xml中注册该Activity:

<activity android:name=".HiltTestActivity" />

步骤2:修正launchFragmentInHiltContainer实现

移除对FragmentScenario.EmptyFragmentActivity的依赖,通过直接复制常量值规避权限限制:

@ExperimentalCoroutinesApi
inline fun <reified T : Fragment> launchFragmentInHiltContainer(
    fragmentArgs: Bundle? = null,
    themeResId: Int = androidx.fragment.testing.R.style.FragmentScenarioEmptyFragmentActivityTheme,
    fragmentFactory: FragmentFactory? = null,
    crossinline action: T.() -> Unit = {}
) {
    // 直接使用原常量的字符串值,避免访问internal类
    val THEME_EXTRAS_BUNDLE_KEY = "androidx.fragment.app.testing.FragmentScenario.EmptyFragmentActivity.THEME_EXTRAS_BUNDLE_KEY"
    
    val mainActivityIntent = Intent.makeMainActivity(
        ComponentName(
            ApplicationProvider.getApplicationContext(),
            HiltTestActivity::class.java
        )
    ).putExtra(THEME_EXTRAS_BUNDLE_KEY, themeResId)

    ActivityScenario.launch<HiltTestActivity>(mainActivityIntent).onActivity { activity ->
        fragmentFactory?.let {
            activity.supportFragmentManager.fragmentFactory = it
        }
        val fragment = activity.supportFragmentManager.fragmentFactory.instantiate(
            Preconditions.checkNotNull(T::class.java.classLoader),
            T::class.java.name
        )
        fragment.arguments = fragmentArgs

        activity.supportFragmentManager.beginTransaction()
            .add(android.R.id.content, fragment, "")
            .commitNow()

        (fragment as T).action()
    }
}

关键修改说明

  • 直接复制原THEME_EXTRAS_BUNDLE_KEY的字符串值,规避对internal类常量的访问限制
  • 用自定义的HiltTestActivity替代原EmptyFragmentActivity作为Fragment的承载容器
  • 完整保留原方法核心功能:支持传递Fragment参数、自定义主题、配置FragmentFactory、执行Fragment内操作

内容的提问来源于stack exchange,提问作者Ali Doran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 07:24:22