- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
就在最近 context.getResources()。 updateConfiguration()已在 Android API 25 中弃用,建议使用上下文。 createConfigurationContext()相反。
有谁知道如何使用 createConfigurationContext 来覆盖 android 系统语言环境?
在此之前由以下人员完成:
Configuration config = getBaseContext().getResources().getConfiguration();
config.setLocale(locale);
context.getResources().updateConfiguration(config,
context.getResources().getDisplayMetrics());
最佳答案
灵感来自 Calligraphy ,我最终创建了一个上下文包装器。就我而言,我需要覆盖系统语言以便为我的应用用户提供更改应用语言的选项,但这可以使用您需要实现的任何逻辑进行自定义。
import android.annotation.TargetApi;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Configuration;
import android.os.Build;
import java.util.Locale;
public class MyContextWrapper extends ContextWrapper {
public MyContextWrapper(Context base) {
super(base);
}
@SuppressWarnings("deprecation")
public static ContextWrapper wrap(Context context, String language) {
Configuration config = context.getResources().getConfiguration();
Locale sysLocale = null;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
sysLocale = getSystemLocale(config);
} else {
sysLocale = getSystemLocaleLegacy(config);
}
if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setSystemLocale(config, locale);
} else {
setSystemLocaleLegacy(config, locale);
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
context = context.createConfigurationContext(config);
} else {
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}
return new MyContextWrapper(context);
}
@SuppressWarnings("deprecation")
public static Locale getSystemLocaleLegacy(Configuration config){
return config.locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static Locale getSystemLocale(Configuration config){
return config.getLocales().get(0);
}
@SuppressWarnings("deprecation")
public static void setSystemLocaleLegacy(Configuration config, Locale locale){
config.locale = locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static void setSystemLocale(Configuration config, Locale locale){
config.setLocale(locale);
}
}
并注入(inject)您的包装器,在每个 Activity 中添加以下代码:
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(MyContextWrapper.wrap(newBase,"fr"));
}
2020 年 12 月 22 日更新Android Material library 实现 ContextThemeWrapper 支持深色模式后,语言设置会中断,语言设置会丢失。经过几个月的摸索,通过在 Activity 和 Fragment 的 onCreate 方法中添加以下代码解决了问题
Context context = MyContextWrapper.wrap(this/*in fragment use getContext() instead of this*/, "fr");
getResources().updateConfiguration(context.getResources().getConfiguration(), context.getResources().getDisplayMetrics());
2018 年 10 月 19 日更新有时在方向更改或 Activity 暂停/恢复后,配置对象重置为默认系统配置,结果我们将看到应用程序显示英语“en”文本,即使我们用法语“fr”语言环境包装了上下文。因此,作为一种好的做法,切勿将 Context/Activity 对象保留在 Activity 或 fragment 的全局变量中。
此外,在 MyBaseFragment 或 MyBaseActivity 中创建和使用以下内容:
public Context getMyContext(){
return MyContextWrapper.wrap(getContext(),"fr");
}
此实践将为您提供 100% 无错误的解决方案。
关于Android context.getResources.updateConfiguration() 已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41381878/
我正在为英语和印地语创建多语言应用 下面是我使用的代码,它运行良好,但有些东西已被弃用,请告诉我如何解决它, 弃用的代码是 conf.locale = myLocale; res.updateConf
就在最近 context.getResources()。 updateConfiguration()已在 Android API 25 中弃用,建议使用上下文。 createConfiguration
就在最近 context.getResources()。 updateConfiguration()已在 Android API 25 中弃用,建议使用上下文。 createConfiguration
编辑 2 编辑 覆盖 attachBaseContext 方法以更新 Activity 中的上下文 protected override void AttachBaseContext(Context
就在最近,context.getResources().updateConfiguration() 已在 Android API 25 中弃用,我需要更改用户选择的应用语言。我正在使用这种方法来更改语
我正在使用这个 Android API Context.Resources.UpdateConfiguration(Configuration, DisplayMetrics),但是它已经被弃用了,所
我是一名优秀的程序员,十分优秀!