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

如何在Jetpack Compose中设置自定义Context以适配服务端下发资源?

失效原因

Jetpack Compose 的 LocalContext 初始值确实取自宿主Activity实例,但仅重写 attachBaseContext 不生效的核心原因是:

  • Compose 内部会在初始化及Configuration更新时,基于系统默认逻辑构造ContextWrapper,可能覆盖你自定义的上下文包装
  • 自定义的Resources替换逻辑未注入到Compose的CompositionLocal树中,渲染时读取的仍是默认上下文的资源

解决方案

步骤1:保留原有attachBaseContext逻辑

现有自定义Context包装的代码无需修改,保证Activity层面的上下文是你实现了服务端字符串替换的自定义实例即可。

步骤2:在setContent入口手动覆盖LocalContext

在setContent的最外层通过CompositionLocalProvider,将Activity的自定义实例直接提供给Compose树的LocalContext,替换默认生成的Context实例:

@AndroidEntryPoint
class MyComposeActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            // 手动注入自定义Context到Compose树
            CompositionLocalProvider(
                LocalContext provides this@MyComposeActivity
            ) {
                ProvideWindowInsets(windowInsetsAnimationsEnabled = true) {
                    MyComposeActivityScreen()
                }
            }
        }
    }

    override fun attachBaseContext(newBase: Context?) {
        val language = Locale(Utils.getLanguage(newBase))
        super.attachBaseContext(MyCustomContextWrapper.wrap(MyCustomResourcesContextWrapper(newBase), language))
    }
}

步骤3:运行时动态更新适配(可选)

如果你的应用支持运行时切换语言、动态更新服务端下发的字符串资源,需要额外做两处适配:

  • 重写Activity的onConfigurationChanged方法,触发自定义Context的重新包装逻辑
  • 将Context包装逻辑封装为可组合函数,配置变更时自动刷新LocalContext的取值

验证

配置完成后,在任意Compose函数中调用stringResource(id)或LocalContext.current.getString(id),都会直接返回你服务端替换后的字符串,无需修改现有资源调用代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:45:07