“locale”配置变量已被弃用 - Android

36
我使用这段代码在多语言应用程序中手动设置默认语言:
public static void setLanguage(Context context, String languageCode){
    Locale locale = new Locale(languageCode);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    config.locale = locale;  // Deprecated !!
    context.getApplicationContext().getResources().updateConfiguration(config,
            context.getResources().getDisplayMetrics());
}

现在我们无法通过config.locale设置语言区域,因为该变量将在API 24中被删除,已弃用。

所以我看到的替代方法是设置:

config.setLocales();

locale

API等级1中添加

Locale locale

此字段已在API级别24中过时。不要直接设置或读取此字段使用getLocales()和setLocales(LocaleList)。如果只需要主要语言环境,则现在首选访问器为getLocales().get(0)。

当前用户对于语言环境的首选项,对应于语言环境资源限定符。

我还注意到,对于API 17及以上版本,也有setLocale(Locale)

我检查了setLocales(LocalList)文档,并标记为灰色,好像它也已过时!

那么解决方案是什么呢?

1个回答

39
希望这有帮助,我还添加了获取器。
@SuppressWarnings("deprecation")
public Locale getSystemLocaleLegacy(Configuration config){
    return config.locale;
}

@TargetApi(Build.VERSION_CODES.N)
public Locale getSystemLocale(Configuration config){
    return config.getLocales().get(0);
}

@SuppressWarnings("deprecation")
public void setSystemLocaleLegacy(Configuration config, Locale locale){
    config.locale = locale;
}

@TargetApi(Build.VERSION_CODES.N)
public void setSystemLocale(Configuration config, Locale locale){
    config.setLocale(locale);
}

public static void setLanguage(Context context, String languageCode){
    Locale locale = new Locale(languageCode);
    Locale.setDefault(locale);
    Configuration config = new Configuration();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        setSystemLocale(config, locale);
    }else{
        setSystemLocaleLegacy(config, locale);
    }
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)
        context.getApplicationContext().getResources().updateConfiguration(config,
            context.getResources().getDisplayMetrics());
}

2016年12月3日更新

由于context.getApplicationContext().getResources().updateConfiguration()现在已被弃用,我强烈建议您查看此解决方案并采用不同的方法来覆盖Android系统配置。

更好的解决方案: https://dev59.com/MVkS5IYBdhLWcg3wMkBJ#40704077


1
对于 setSystemLocale(. 版本 N .),Google 建议用户使用 setLocales 而不是 setLocale。即使您只有一个语言环境,也可以轻松地添加语言环境列表:config.setLocales(new LocaleList(locale)); https://developer.android.com/reference/android/content/res/Configuration.html#setLocale(android.os.Locale) - Jose M Lechon
1
弃用仅适用于直接访问config.locale,以强制开发人员使用setter和getter。此外,在最后的N版中引入了setLocale,因此如果只有一个语言环境,则可以安全地使用它。 - Bassel Mourjan
2
嗨,我真的很喜欢你的答案,但是你发布了一个更好的解决方案的链接,你能否简要解释一下为什么它更好?如果我没记错的话,“更好的解决方案”建议在每个活动中运行那段代码,如果可能的话,我宁愿避免这样做,尽管我有一个BaseActivity...提前感谢! - Vladislav Kan
对于安装了6.0.1的三星设备,存在一个问题。Locale仅在第一次工作时有效,从第二次开始将采用设备默认设置。有没有解决方案? - Pandiri Deepak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接