时间:2021-05-21
前言
项目里有个功能,在应用内切换语言,之前上线了大半年,一直都是正常运行,但是最近这次发版以后,在国外的同事反馈(这里面还包括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及以上系统版本就不会出问题了。
结语
说实话,这还是我第一次遇到废弃的方法就真的不好使了。以前参与过的项目里或多或少都有一些过时的属性、方法,但是它们都顽强地肩负着自己的使命,看起来好像永远不会真的被废弃...
经过这一次,让我吸取了教训,废弃的方法和属性最好尽早替换掉,它虽然现在没有问题,但是保不齐哪天就不好使了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Android7.0行为变更FileUriExposedException解决方法当我们开发关于【在应用间共享文件】相关功能的时候,在Android7.0上经常
以华为手环B2为例,华为手环可以配别的品牌手机,华为手环基本上都支持匹配Android4.0及以上,IOS7.0及以上版本的手机。 华为手环(TalkBand
前言Android7.0系统发布后,拿到能升级的nexus6P,就开始了7.0的适配。发现在Android7.0以上,在相机拍照和图片裁剪上,可能会碰到以下一些
前言最近公司需要切换多语言和字体大小功能,上网查看比较少的实用方案。于是我经过几天尝试和思考完成了第一版的应用内多语言版本切换的功能Demo。下面分享给大家,需
以华为手环B2为例,华为智能手环可以配别的品牌手机,华为智能手环基本上都支持匹配Android4.0及以上,IOS7.0及以上版本的手机。 华为手环只要满足其