温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android 7.0以上版本如何实现应用内语言切换

发布时间:2021-08-06 11:32:32 来源:亿速云 阅读:124 作者:小新 栏目:移动开发

小编给大家分享一下Android 7.0以上版本如何实现应用内语言切换,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

正文

首先这部分功能的代码是之前已经离职的同事留下的,一直跑得好好的,我也没去动过,发版前用别的手机测试也没有出现问题,怎么突然就出现中英文混乱了呢?难道是华为的锅?国外同事的手机没法拿来调试,听说他们也都是在国内买了带到国外去的,后来我也在身边找了几个华为手机试了一下,并没有出现问题,我陷入了沉思...

整理了一下线索:

  1. 国外同事的华为手机出现问题,我身边朋友的华为手机没有问题

  2. 这部分代码之前一直没有问题,现在突然出现了问题

  3. 这期间我也看了一下相关代码,确实没有修改过。但是!我发现了一个疑点:代码中使用了一些废弃的方法和属性

Android 7.0以上版本如何实现应用内语言切换

难道是?

我赶紧去问国外的同事,系统版本是多少,果然不出所料,国外同事的系统版本已经更新到了最新的8.0版本。这下一切都说得通了,华为是国内最早升级8.0系统的厂商,升级的策略一般是先从旗舰机开始,逐步向下辐射,而当下正值部分高端机型已经升级到了8.0系统,而中低端机型还没有开始推送的时间节点。很有可能问题就出在那几个废弃的方法和属性上。

在网上查找了相关资料后,证实了我的猜想。下图是我之前使用的方法:

Android 7.0以上版本如何实现应用内语言切换

废弃的方法和属性

可以看到 configuration.locale 属性和 updateConfiguration 方法都已经被打上了废弃的标记。7.0系统推出后告诉开发者方法已经过时,到了8.0系统上这段代码就已经完全不好使了,所以才出现了前面提到的问题。

那么为什么Google会废弃这段代码呢?其实原因很明显,在7.0系统以后,我们的系统语言选择已经不再是设置一种语言,而是可以设置一组语言:

Android 7.0以上版本如何实现应用内语言切换

7.0版本后的语言设置界面

Google把语言这一块进行了较大的调整,系统会根据这个列表的优先级去适配语言。机制都变了,以前的代码当然会废弃掉了。

既然我们已经找到了问题的原因,那么如何去解决呢?

首先,我们需要实现一个自己的MyContextWrapper,它会根据不同的系统版本采用相应方法来设置 Locale 或者 LocaleList ,并且返回一个ContextWrapper:

public class MyContextWrapper extends android.content.ContextWrapper {

  public MyContextWrapper(Context base) {
    super(base);
  }

  public static ContextWrapper wrap(Context context, Locale newLocale) {

    Resources res = context.getResources();
    Configuration configuration = res.getConfiguration();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

      configuration.setLocale(newLocale);
      LocaleList localeList = new LocaleList(newLocale);
      LocaleList.setDefault(localeList);
      configuration.setLocales(localeList);
      context = context.createConfigurationContext(configuration);

    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

      configuration.setLocale(newLocale);
      context = context.createConfigurationContext(configuration);

    }

    return new ContextWrapper(context);
  }
}

接下来,我们只需要在我们的 BaseActivity 里重写 attachBaseContext() 方法即可,代码如下:

@Override
  protected void attachBaseContext(Context newBase) {
    Locale newLocale;
    // .. create or get your new Locale object here.

    Context context = MyContextWrapper.wrap(newBase, newLocale);
    super.attachBaseContext(context);
  }

大功告成,这样在7.0及以上系统版本就不会出问题了。

以上是“Android 7.0以上版本如何实现应用内语言切换”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI