android - createConfigurationContext 无法在 API 级别 <26 上以编程方式更改语言
问题描述
我已经阅读了有关在运行时更改应用内语言的所有内容。目前一切都适用于 API 26+27+28+29(是的,我已经测试了所有这些),并开始在 API 25 及以下版本中断。现在我唯一知道的 API 级别 26 中发生的事情是应用程序和活动在默认情况下不再共享相同的资源(也称为顶级资源)。而且资源的 updateConfiguration 也被弃用,取而代之的是 API 25 中的 createConfigurationContext
然而,这真的给了我零线索。
这是我的代码:
public class BaseApp extends MultiDexApplication { //for MinSDK < 21, otherwise "extends Application"
@Override
public void onCreate() {
LocaleHelper.updateResources(this);
super.onCreate();
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(LocaleHelper.updateResources(base));
MultiDex.install(this); /* Needed as per (@link MultiDexApplication) */
}
@Override
public void onConfigurationChanged(Configuration config) {
super.onConfigurationChanged(config);
LocaleHelper.updateResources(this);
}
基础活动:
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(LocaleHelper.updateResources(base));
}
助手类:
class LocaleHelper {
static Context updateResources(Context context) {
Resources resources = context.getResources();
Configuration config = new Configuration(resources.getConfiguration());
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
String lang = preferences.getString(Constants.PREF_KEY_LOCALE_OVERRIDE, Constants.PREF_VALUE_LOCALE_SYSTEM);
Locale locale = new Locale(lang);
if (Build.VERSION.SDK_INT >= 17) {
config.setLocale(locale);
context = context.createConfigurationContext(config);
} else {
config.locale = locale;
resources.updateConfiguration(config, resources.getDisplayMetrics());
}
return context;
}
解决方案
这是 AndroidX 的 AppCompat 实现的一个已知错误。该错误在版本 1.0.0 中:'androidx.appcompat:appcompat:1.1.0' 我确认它在库的版本 1.2.0 中有效。
推荐阅读
- java - 从字符列表中创建字符串然后清除它的最有效方法
- r - R 在函数内绘制箱线图无法正确显示 y 数据
- javascript - React.createElement:类型无效——需要一个字符串——index.js
- python - 我可以通过烧瓶请求获取 URL 参数(在 url 规则中设置)吗?
- sql - 确定表中的非活动记录
- typescript - 在 Typescript 中,如何在声明函数之前使用它?
- slack - Slack API:如何更改 Legacy API 令牌的用户名?
- flutter - 允许区分提供者
- powershell - 我的远程注册表查找器中的 Powershell 机器名称未输出到文本文件
- hyperledger-fabric - Hyperledger Fabric 1.4 是否支持 golang 1.12.x?