该应用程序在 nougat api 7 ++ 上没有获得本地化更改效果

Posted

技术标签:

【中文标题】该应用程序在 nougat api 7 ++ 上没有获得本地化更改效果【英文标题】:The app doesn't get the localization change effect on nougat api 7 ++ 【发布时间】:2018-03-13 21:11:01 【问题描述】:

我的spinner 有一个自定义适配器:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item) 

      .............

    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    adapter.add(context.getResources().getString(R.string.value1));
    adapter.add(context.getResources().getString(R.string.value2));
    adapter.add(context.getResources().getString(R.string.hint));
    spinner.setAdapter(adapter);

一切都按预期工作,但列表适配器,当我更改应用程序语言时,每件事都得到了语言更改效果,但列表适配器没有。

我有两种语言的资源。

我正在通过这种方法更改语言:

public  void setLocale(String lang) 
    Locale myLocale = new Locale(lang);
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = myLocale;
    res.updateConfiguration(conf, dm);


在我在像 lolipop 这样的低端设备上测试了这个案例后,它也能正常工作,这是 android oreo 8.0 的当前问题。

因为conf.locale = myLocale; 在 API 级别 24 中已被弃用。

所以我没有直接使用conf.locale = myLocale;。使用getLocales()setLocales(LocaleList)。如果只需要主要语言环境,getLocales().get(0) 现在是首选访问器。

另外,updateConfiguration 在 API 级别 25 中已被弃用,我改用 createConfigurationContext (Configuration overrideConfiguration)

但它不起作用,我错过了什么吗?

【问题讨论】:

如果在更改语言后用新的微调器替换它怎么办?那它有用吗? “当我更改应用程序语言时”——您是通过设置为整个设备更改此设置,还是在做其他事情? @CommonsWare 更新了问题,我正在通过应用程序自行更改它。 @JohnPerry 你的意思是每种语言的微调器?如果那样,当然不会。 @Ibrahim 我的意思是手动创建一个新的微调器并将其添加到布局中。不是基于每种语言;语言应该由系统处理。关键是查看系统是否会在您添加新布局时创建带有正确翻译的微调器。 【参考方案1】:

在将 Activity context 而不是 applicationContext 传递给 spinnerAdapter 后,此问题已得到解决。

我只是将spinnerAdapter = new SpinnerAdapter(getApplicationContext()); 更改为 spinnerAdapter = new SpinnerAdapter(MainActivity.this);

A REF.

【讨论】:

以上是关于该应用程序在 nougat api 7 ++ 上没有获得本地化更改效果的主要内容,如果未能解决你的问题,请参考以下文章

Android Camera 2 API 在 Nougat 7.1 上的 flash 问题

Android Nougat 7.1 在启动 WebView 后重置区域设置

Android API 25 (7.1.1) Nougat (Android.jar子包整理)

仅从 Android 7.0 (Nougat) 开始支持默认接口方法

GoogleServices API 级别更改早于 Nougat(API 级别 24)

Nougat 7 不支持 Android 相机裁剪