Android 7.0以上版本实现应用内语言切换的方法

作者:实例波 时间:2022-12-21 00:25:31 

前言

项目里有个功能,在应用内切换语言,之前上线了大半年,一直都是正常运行,但是最近这次发版以后,在国外的同事反馈(这里面还包括CEO... 尴尬),他们的华为手机上出现了中英文混乱的问题。本文记录了解决问题的过程和方法。

正文

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

整理了一下线索:

  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及以上系统版本就不会出问题了。

结语

说实话,这还是我第一次遇到废弃的方法就真的不好使了。以前参与过的项目里或多或少都有一些过时的属性、方法,但是它们都顽强地肩负着自己的使命,看起来好像永远不会真的被废弃...

经过这一次,让我吸取了教训,废弃的方法和属性最好尽早替换掉,它虽然现在没有问题,但是保不齐哪天就不好使了。

来源:https://www.jianshu.com/p/32ff13db1f0d

标签:Android,内语言,切换
0
投稿

猜你喜欢

  • 完美解决Android三星手机从图库选择照片旋转问题

    2023-10-11 00:32:53
  • Java Fluent Mybatis 分页查询与sql日志输出详解流程篇

    2023-01-06 05:35:43
  • Android mvvm之LiveData原理案例详解

    2023-09-29 11:49:26
  • Android实现自动点击无障碍服务功能的实例代码

    2022-08-31 12:14:26
  • Java单元测试Powermockito和Mockito使用总结

    2021-11-12 14:59:07
  • C# Record构造函数的行为更改详解

    2022-01-21 04:50:11
  • C#图像处理之边缘检测(Smoothed)的方法

    2022-05-30 12:13:09
  • 基于ArrayList源码解析(基于JDK1.8)

    2021-10-07 18:34:25
  • springboot项目如何设置session的过期时间

    2022-12-31 23:45:27
  • datatable生成excel和excel插入图片示例详解

    2022-06-18 21:48:38
  • Maven打包jar包没有主属性问题解决方案

    2023-11-25 06:56:32
  • JVM内存增强之逃逸分析

    2022-01-23 00:22:08
  • Unity之绕轴进行旋转的操作

    2021-11-14 17:53:10
  • C#使用base64对字符串进行编码和解码的测试

    2022-09-21 23:08:59
  • Java Swing组件布局管理器之FlowLayout(流式布局)入门教程

    2021-11-08 05:33:06
  • 使用Springboot+poi上传并处理百万级数据EXCEL

    2021-12-18 17:38:28
  • Zookeeper事务日志预分配空间解读

    2022-03-16 22:36:49
  • JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现

    2023-09-17 17:03:59
  • spring boot容器启动流程

    2023-02-17 09:25:36
  • C#中使用Join与GroupJoin将两个集合进行关联与分组

    2023-11-11 23:40:47
  • asp之家 软件编程 m.aspxhome.com