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

