Android 7.0以上版本实现应用内语言切换的方法
作者:实例波 发布时间:2022-12-21 00:25:31
前言
项目里有个功能,在应用内切换语言,之前上线了大半年,一直都是正常运行,但是最近这次发版以后,在国外的同事反馈(这里面还包括CEO... 尴尬),他们的华为手机上出现了中英文混乱的问题。本文记录了解决问题的过程和方法。
正文
首先这部分功能的代码是之前已经离职的同事留下的,一直跑得好好的,我也没去动过,发版前用别的手机测试也没有出现问题,怎么突然就出现中英文混乱了呢?难道是华为的锅?国外同事的手机没法拿来调试,听说他们也都是在国内买了带到国外去的,后来我也在身边找了几个华为手机试了一下,并没有出现问题,我陷入了沉思...
整理了一下线索:
国外同事的华为手机出现问题,我身边朋友的华为手机没有问题
这部分代码之前一直没有问题,现在突然出现了问题
这期间我也看了一下相关代码,确实没有修改过。但是!我发现了一个疑点:代码中使用了一些废弃的方法和属性
难道是?
我赶紧去问国外的同事,系统版本是多少,果然不出所料,国外同事的系统版本已经更新到了最新的8.0版本。这下一切都说得通了,华为是国内最早升级8.0系统的厂商,升级的策略一般是先从旗舰机开始,逐步向下辐射,而当下正值部分高端机型已经升级到了8.0系统,而中低端机型还没有开始推送的时间节点。很有可能问题就出在那几个废弃的方法和属性上。
在网上查找了相关资料后,证实了我的猜想。下图是我之前使用的方法:
废弃的方法和属性
可以看到 configuration.locale 属性和 updateConfiguration 方法都已经被打上了废弃的标记。7.0系统推出后告诉开发者方法已经过时,到了8.0系统上这段代码就已经完全不好使了,所以才出现了前面提到的问题。
那么为什么Google会废弃这段代码呢?其实原因很明显,在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


猜你喜欢
- 一、什么是JSONJSON(JavaScript Object Notation)是一种基于JavaScript语法子集的开放标准数据交换格
- 桥接模式桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)
- 前言在Spring Boot的自动配置中经常看到@ConditionalOnProperty注解的使用,本篇文章带大家来了解一下该注解的功能
- 先明确几个概念的区别: padding margin都是边距的含义,关键问题得明白是什么相对什么的边距. padding是控件的内容相对控件
- 我们经常需要对我们的开发的软件做各种测试, 软件对系统资源的使用情况更是不可少, 目前有多个监控工具, 相比JProfiler对系统资源尤其
- 案例sql脚本DROP DATABASE IF EXISTS `javacode2018`;CREATE DATABASE `javacod
- 这个工具叫“InstallShield”,可以自己去网上下一个,有绿色版本 也有安装版的。 &
- 填充背景色,一般可以选择多种不同样式来填充背景,包括填充为纯色背景、渐变背景、图片背景或者纹理背景等。下面的内容将分别介绍通过C#来设置Ex
- 夏天到了、小雪来给大家降降温话不多说、直接进入主题主要功能模块设计:登录注册、首页信息浏览、选课分类查看、选课详情查看、评论交流、收藏、浏览
- 刚学完JDBC不久,做了一个简单的学生管理系统,可能还有不完善的地方,望各路大神见谅。废话不多说,我先贴个图让大家让大家瞅瞅,觉得是你想要的
- 方式一:在所有mapper接口使用@Mapper注解@Mapper(将包中的所有接口都标注为DAO层接口)public interface
- 本文实例讲述了Spring实战之清除缓存操作。分享给大家供大家参考,具体如下:一 配置文件<?xml version="1.
- 本文实例为大家分享了Java实现通讯录管理系统的具体代码,供大家参考,具体内容如下题目:1、完成一个通讯录,需求:(1)添加联系人(联系人:
- 简介AccessibilityService的设计初衷是为了辅助有身体缺陷的群体使用Android应用,它的设计贯穿着Android的控件树
- 本文实例讲述了C#简单获取全屏中鼠标焦点位置坐标的方法。分享给大家供大家参考,具体如下:using System;using System.
- 本文实例总结了.net与javascript脚本的交互方法,分享给大家供大家参考。具体方法如下:1.asp.net呼叫jsResponse.
- 如题。3.6 版本的AS,对于活动布局文件的显示有text和view模式,但是切换的按钮位置与之前版本的不同。如下图在右上角的三个按钮点击1
- 本文实例讲述了C#通过属性名字符串获取、设置对象属性值操作.分享给大家供大家参考,具体如下:#通过反射获取对象属性值并设置属性值0、定义一个
- 正则表达式是一种描述词素的重要表示方法。虽然正则表达式并不能表达出所有可能的模式(例如“由等数量的 a 和 b 组成的字符串”),但是它可以
- 概述最近在对之前写的一个 Spring Boot 的视频网站项目做功能完善,需要利用 FFmpeg 实现读取视频信息和自动截图的功能,查阅资