如何覆盖 Android 应用程序中的配置?
Posted
技术标签:
【中文标题】如何覆盖 Android 应用程序中的配置?【英文标题】:How to override configuration in Android application? 【发布时间】:2018-08-12 06:27:12 【问题描述】:已解决(底部的解决方案)
在我的活动中,我需要阅读首选项,然后覆盖配置。在构造函数中 Context 还没有准备好:
尝试在空对象引用上调用虚拟方法“java.lang.String android.content.Context.getPackageName()”
在onCreate
为时已晚:
java.lang.IllegalStateException: getResources() 已经被调用
引用自 ContextThemeWrapper documentation:
此 [applyOverrideConfiguration] 方法只能调用一次,并且必须在调用 getResources() 或 getAssets() 之前调用。
什么是覆盖配置的正确时间和地点?
下面是我当前工作解决方案的代码摘录。
class OverrideActivity extends AppCompatActivity
// ...
private boolean __overrideConf = false;
@Override
public Resources getResources()
if (!__overrideConf)
// ...
// read shared preferences needs context
// ...
applyOverrideConfiguration(configuration);
__overrideConf = true;
return super.getResources();
解决方案(覆盖受保护的方法attachBaseContext)
@Override
protected void attachBaseContext(Context newBase)
super.attachBaseContext(newBase);
applyOverrideConfiguration(new Configuration());
【问题讨论】:
【参考方案1】:解决方案(覆盖受保护的方法attachBaseContext)
@Override
protected void attachBaseContext(Context newBase)
super.attachBaseContext(newBase);
// copypaste safe code
applyOverrideConfiguration(new Configuration());
【讨论】:
谢谢!此解决方案帮助我解决了在实施 Dagger Hilt 后更改语言在 Android 7 及更低版本中无法正常工作的问题。【参考方案2】:升级到 appcompat 1.2.0 解决了 java.lang.IllegalStateException 的问题:getResources() 已被调用。 将 appcompat 依赖应用级别 build.gradle 替换为这个
dependencies
implementation 'androidx.appcompat:appcompat:1.2.0'
【讨论】:
以上是关于如何覆盖 Android 应用程序中的配置?的主要内容,如果未能解决你的问题,请参考以下文章
我如何才能等到我的 Android 应用程序中的协程作用域执行完成?