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

为何ContextWrapper未在Activity中生效?是否与Localize有关?

问题:使用Localize时ContextWrapper无法应用到Activity

在项目中使用Localize时,遇到ContextWrapper无法应用到Activity的问题,无更多附加描述。

相关代码实现

MainScreenActivity类

class MainScreenActivity : BaseActivity() {
...
    override fun fetchStringResourceKeys(): Map<Int, String> {
        return ResourceKeys::class.java.fields.associate { field: Field -> 
            field.getInt(null) to field.name 
        }
    }

    override fun attachBaseContext(newBase: Context) {
        val updatedThemeContext = newBase.getDependencies<MainActivityDependencies>()
            .themeManager
            .applyTheme(newBase)
        super.attachBaseContext(LocalizationContextWrapper.wrap(updatedThemeContext))
    }
...
}

BaseActivity抽象类

abstract class BaseActivity : AppCompatActivity() {
...
    abstract fun fetchStringResourceKeys(): Map<Int, String>

    override fun attachBaseContext(newBase: Context) {
        val customContextWrapper = ResourceKeyContextWrapper(
            baseContext = newBase,
            stringResourceKeys = fetchStringResourceKeys(),
        )
        super.attachBaseContext(customContextWrapper)
    }
...
}

ResourceKeyContextWrapper类

internal class ResourceKeyContextWrapper(
    baseContext: Context,
    private val stringResourceKeys: Map<Int, String>,
) : ContextWrapper(baseContext) {
    override fun getResources(): Resources {
        val originalResources = super.getResources()
        return CustomResources(
            originalResources = originalResources,
            stringResourceKeys = stringResourceKeys,
        )
    }
}

CustomResources类

internal class CustomResources(
    originalResources: Resources,
    private val stringResourceKeys: Map<Int, String>,
) : Resources(originalResources.assets, originalResources.displayMetrics, originalResources.configuration) {

    override fun getString(@StringRes id: Int): String = 
        stringResourceKeys[id] ?: super.getString(id)

    override fun getString(@StringRes id: Int, vararg formatArgs: Any?): String {
        return stringResourceKeys[id] ?: super.getString(id, *formatArgs)
    }

    override fun getText(id: Int): CharSequence = 
        stringResourceKeys[id] ?: super.getText(id)
}

已尝试的解决方案

  • 完全移除RootActivity中的相关调用
  • 反复检查fetchStringResourceKeys,确认其返回内容正常
  • 调用attachBaseContext2代理并对其应用包装
  • 将包装应用到ApplicationContext,但无法获取字符串键
  • 跳过Localize包装调用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:54:51