专栏首页非著名程序员Android面试系列之应用内多语言切换

Android面试系列之应用内多语言切换

昨天组里的同事遇到一些切换多语言的细节问题,发现在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,你能找到它吗?

本文分享自微信公众号 - 非著名程序员(non-famous-coder),作者:Even Lan

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-06-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Google 规定只有 Android 8.0 才能从 Google Play 下载应用

    据 XDA 报道,谷歌已经在今年三月份停止了对 Google Play 认证设备的安卓 7.0 系统认证,这意味着从本月开始手机想要通过 Google Play...

    非著名程序员
  • Android开发方便快捷的8个好工具,你造吗?

    Android是第二个最流行的用于 智能手机和平板电脑 的操作系统。这里有8个最好的 Android工具以许多不同的方式 帮助开发人员 ,例如 - SDK和AV...

    非著名程序员
  • Google I/O 大会来袭前的一枚炸弹

    非著名程序员
  • Python VS Matlab----给我一个理由先

    最近好多人问我这个问题:究竟要学哪门语言比较好,是Matlab还是Python呢。所以今天我就两门语言做一个详细介绍,大家也可以根据自己的兴趣做出自己的选择。...

    量化投资与机器学习微信公众号
  • Python并非为AI而生,Golang将统治人工智能的下一个十年?

    根据2019年Stack Overflow的调查,Python成为开发人员第二喜爱的语言。

    新智元
  • vim实用笔记

    章鱼喵
  • Python赶超R语言,成为数据科学、机器学习平台中最热门的语言?

    近日,kdnuggets 做了一个关于数据科学、机器学习语言使用情况的问卷调查,他们分析了 954 个回答,得出结论——Python 已经打败 R 语言,成为分...

    AI研习社
  • 开发 | Python赶超R语言,成为数据科学、机器学习平台中最热门语言?

    AI科技评论消息,近日,kdnuggets做了一个关于数据科学、机器学习语言使用情况的问卷调查,他们分析了954个回答,得出结论——Python已经打败R语言,...

    AI科技评论
  • [现代编译原理C语言描述].(美国)Andrew.W.Appel.清晰版

    《现代编译原理:C语言描述》全面讲述了现代编译器的结构、编译算法和实现方法,是Andrew w.Apple的“虎书”——Modern Compiler Impl...

    用户3157710
  • 以太坊·食品溯源案例

    以太坊·食品溯源案例 内容摘要 这一部关于区块链开发及运维的电子书。 为什么会写区块链电子书?因为2018年是区块链年。 这本电子书是否会出版(纸质图书)? 不...

    netkiller old

扫码关注云+社区

领取腾讯云代金券