Android面试集锦系列(37)——如何实现应用内多语言切换?

作者 : 开心源码 本文共1939个字,预计阅读时间需要5分钟 发布时间: 2022-05-12 共100人阅读

昨天组里的同事遇到少量切换多语言的细节问题,发现在Android N版本上配置应用内多语言没有生效,正好拿出来做为一个面试题讲解一下。
面试题:如何实现应用内多语言切换?
我们知道Android的多语言实现很简单,可以在不同的语言环境下使用不同的资源。在不同的res/value-xx下放置不同语言的strings.xml实现字符的本地化,而这个value-xx目录的选择是根据Resource中的Configuration.Locale这项的值来决定的。如zh中文,就会选择value-zh目录,假如没有匹配到(即APK中没有value-zh目录)就使用默认的value目录中的字符资源。

其实最终实现字符串的选择都是在Assets这个类中,通过Native的方法来加载相应的字符串资源。

然而,我们还是会有少量业务场景需要不根据Android系统的Locale配置就改变应用的语言。实现的方式也很简单,直接调用Android开放的接口Resources.updateConfiguration:

    public static void changeSystemLanguage(Context context, String language) {        if (context == null || TextUtils.isEmpty(language)) {            return;        }        Resources resources = context.getResources();        Configuration config = resources.getConfiguration();        if (Locale.SIMPLIFIED_CHINESE.getLanguage().equals(language)) {            config.locale = Locale.SIMPLIFIED_CHINESE;        } else {            config.locale = new Locale(language);        }        resources.updateConfiguration(config, null);    }

上面的代码,我们可以在应用内通过language的值指定是显示哪种语言,当然language值我们需要保存在Preferences或者者数据库中。
如同很简单,我们的项目为什么还会出现问题呢?而且大家都不知道如何下手,由于在Android N之前的版本都是可以正常切换语言的。后来我跟了一下,发现在MainActivity和SplashActivity这些Activity有继承了自已扩展的BaseActivity,而这个BaseActivity有这样一段代码:

    @Override    public Resources getResources() {        Resources res = super.getResources();        Configuration config = new Configuration();        config.setToDefaults();        res.updateConfiguration(config, res.getDisplayMetrics());        return res;    }

config.setToDefaults会将Locale的值设为null,而再调用updateConfiguration可能会根据Android系统的语言重新设置Resources中的Locale。好吧,只是假设,还没有看到Android N的源代码。不过去掉这段代码后,在Android N(Preview)手机上切换语言正常了。
小结
今天遇到的问题,是以前遗留的代码埋下的坑终于暴露出来,也是这个项目缺乏代码审查(Code Review)机制的结果。找了几个人也无法说清覆写getResources这个方法的意图,最终也只能按历史问题解决了,是历史总有少量说不清楚的事,对吧。
回到这个面试题,现在你知道了可以在应用内切换语言(当然也可以修改Configuration的其余值),那么你有没有想过,假如不知道这个updateConfiguration的存在,你会怎样实现这个需求呢?或者者说没有人和你说过updateConfiguration,你能找到它吗?

最后

在现在这个金三银四的面试季,我自己在网上也搜集了很多资料做成了文档和架构视频资料免费分享给大家【包括高级UI、性能优化、架构师课程、NDK、Kotlin、混合式开发(ReactNative+Weex)、Flutter等架构技术资料】,希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

资料获取方式:加入Android架构交流QQ群聊:513088520 ,进群即领取资料!!!

点击链接加入群聊【Android移动架构总群】:加入群聊

资料大全

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android面试集锦系列(37)——如何实现应用内多语言切换?

发表回复