美文网首页
Android语言国际化--7.0下的手机全屏切换后失效

Android语言国际化--7.0下的手机全屏切换后失效

作者: Alden_Lei | 来源:发表于2018-12-22 15:59 被阅读0次

    最近项目上线语言国际化功能,即实现多语言,主要是简体中文,繁体,英语,韩语,俄语,日语几种语言,俄语恶心的我想哭,简单的一个词超级长一串,弄的我基本上每个页面都调整了下布局,否则丑的哭...

    关于如何切换多语言我就不说了,网上很多方法(注意适配7.0,因为7.0上的切换语言的方法接口有变化,已被坑)。在我调整了布局后还挺高兴,因为大工程结束了啊,然而还是太年轻。测试时发现视频播放界面全屏切换后多语言设置失效了,之前app设置的日语又变成了系统默认的简体中文。
    当屏幕旋转(全屏切换)失效,就设置了activity的

    android:configChanges="locale|orientation|keyboardHidden|screenSize"
    

    还是无效,网络上查找资料,发现解决方案如下:
    1.新建AppContext,继承自Application,重写onConfigurationChanged()方法

      @Override
        public void onConfigurationChanged(Configuration newConfig) {
            LogUtils.e("language test");
            super.onConfigurationChanged(newConfig);
            LanguageUtil.setLocale(this);
        }
    
    1. LanguageUtil.setLocale(this)方法是设置当前app的语言,比如app选择的日语,就把语言设置为日语
     public static Context setLocale(Context context) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                return createConfigurationResources(context);
            } else {
               setConfiguration();
                return context;
            }
        }
    

    3.AndroidManifest.xml文件中application节点下设置name为AppContext,设置android:configChanges

     <application
            android:name=".AppContext"
            android:configChanges="orientation|screenSize|locale"
    

    屏幕旋转时会触发onConfigurationChanged(Configuration newConfig)方法时。这个newConfig取的是系统的,这就是为什么语言会切换到系统语言的原因。所以在这里我们再次设置下locale就能够了。
    或许会疑惑为什么7.0上的设备屏幕旋转后没有出现这个问题呢,那是因为前面提到过的7.0的设备切换语言接口发生了变化,是针对于每个activity或者说context对象生效,而7.0以下的设备是全局的application对象设置语言切换生效

    /**
    *7.0切换语言方法
    **/
      @TargetApi(Build.VERSION_CODES.N)
        private static Context createConfigurationResources(Context context) {
            Resources resources = context.getResources();
            Configuration configuration = resources.getConfiguration();
            //getLanguageLocale()获取当前设置的语言
            Locale locale =getLanguageLocale();
            configuration.setLocale(locale);
            return context.createConfigurationContext(configuration);
        }
    
    /**
         * 7.0以下设置语言切换方法
         */
        public void setConfiguration() {
           //getLanguageLocale()获取当前设置的语言
            Locale targetLocale = getLanguageLocale();
            //mContext是全局的application对象
            Configuration configuration = mContext.getResources().getConfiguration();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                configuration.setLocale(targetLocale);
            } else {
                configuration.locale = targetLocale;
            }
            Resources resources = mContext.getResources();
            DisplayMetrics dm = resources.getDisplayMetrics();
            resources.updateConfiguration(configuration, dm);//语言更换生效的代码!
        }
    

    好了,记录下这个问题,坑了我浪费大半天时间...

    相关文章

      网友评论

          本文标题:Android语言国际化--7.0下的手机全屏切换后失效

          本文链接:https://www.haomeiwen.com/subject/gqiikqtx.html