解决之前App内语言切换的某些bug

来源:互联网 发布:万网如何设置三级域名 编辑:程序博客网 时间:2024/05/29 19:47

我也是醉了,之前写的App内多语言切换机制,今天我在公司的项目中发现了Bug,结果处理了两天总算解决了。


如果你有看http://blog.csdn.net/cuihaoren01/article/details/51027018,这篇文章的话,估计语言切换的机制你基本了解了。这部分内容我就不解释了,先来说说Bug,Bug就是App在休眠的状态下切换屏幕重启后,配置语言变回了本机语言。这么说有点抽象,具体来说就是,(默认你的App必须是横屏的(pad),竖屏的话手机不可能出此问题)比如你在登录界面设置的按钮可以切换语言,你本机语言默认是简体中文,你切换到英文之后,使pad休眠并且把pad竖过来。唤醒屏幕后登录进去,发现语言转换成了中文。按道理应该是英文可显示的确实中文。


Bug产生的原因:

这个问题就涉及到了基本所有的Android生命周期的问题了,我本以为对Android生命周期的理解已经算到位了,结果还是不够深刻。这里就不详述Android的生命周期了,借鉴下别人的博客.
http://blog.csdn.net/wulianghuan/article/details/8603982
http://blog.chinaunix.net/uid-24410388-id-3855498.html


看这两个博客应该可以了解本文需要的Android生命周期的知识了。特别是第一个!onConfigurationChanged的调用机制大家也可以去搜索下。我这里就不给了。

好,回到重点,产生这个Bug的原因如下:我之前在Android开发学习笔记秘籍(十八)中说明了我们要切换语言必须setContentView对吧,而切换屏幕在不加
 android:configChanges="orientation|screenSize|keyboardHidden"
的时候必须会重启整个应用,那这时肯定就会转换成本机语言的。所以我们要添加上面那句话,不执行onCreate(),但你执行onConfigurationChanged也会切换语言(这个我是真的奇怪,明明要执行updateConfiguration才能更新Config为什么单独的onConfigurationChanged就可以了,具体的研究源码吧。)这样
就导致了语言切换出现了很严重的问题,pad一般是默认竖屏的,你的app虽然强制了横屏但是你从休眠转成唤醒的过程它一定是有屏幕切换的,甚至可能是两次屏幕切换。所以这个问题是必须得解决的!

Bug解决方案:

解决方案网上找了一溜基本就是在调用onConfigurationChanged的过程中在强制导入自己的config,而不是系统的config,代码的话还得要在之前的Android开发学习笔记秘籍(十八)添加一些新的东西。

首先,你得要将你设置的语言写入本地,这样的话你就可以在需要的时候读出语言从而进行设置,代码如下:
public void setLanguage(String language){        SharedPreferences sp = getSharedPreferences("language_setting", MODE_PRIVATE);        SharedPreferences.Editor mEditor = sp.edit();        mEditor.putString("language", language);        mEditor.commit();    }
我这里把之前的btn中的点击事件拿出来做成一个函数。
public void switchLanguage(String language){        Resources resources = getResources();        Configuration config = resources.getConfiguration();        DisplayMetrics dm = resources.getDisplayMetrics();        if(language.endsWith("zh")){            config.locale = Locale.SIMPLIFIED_CHINESE;        }else if (language.endsWith("en")){            config.locale = Locale.ENGLISH;        }        resources.updateConfiguration(config, dm);    }
接着在onConfigurationChanged中添加语言设置。只需要读出你之前写入的语言设置,你在重新设置就好了。
大致的代码结构如下:
public void onConfigurationChanged(Configuration newConfig) {        super.onConfigurationChanged(newConfig);        if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){            Log.i(TAG, "onConfigurationChanged: 横屏的时候发生了");        }        if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){            Log.i(TAG, "onConfigurationChanged: 竖屏的时候调用了");        }        if (newConfig.locale.getLanguage().endsWith("zh")){            Log.i(TAG, "onConfigurationChanged: 中文");        }        if (newConfig.locale.getLanguage().endsWith("en")){            Log.i(TAG, "onConfigurationChanged: 英文");        }        <span style="color:#ff0000;">SharedPreferences sp = getSharedPreferences("language_setting", MODE_PRIVATE);        String language = sp.getString("language", null);        switchLanguage(language);</span>        Log.i(TAG, "onConfigurationChanged: had been finished");    }
(测试的那些你就删掉吧。主要就3句话)。这样大致就解决这个Bug了。整个过程就是你首先设置你要切换的语言,同时要把语言写入本地。然后在onConfigurationChanged中读出,在切换一次即可!




0 0
原创粉丝点击