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
相关产品推荐
相关产品推荐

