解决之前App内语言切换的某些bug
2016-05-13 17:00
561 查看
我也是醉了,之前写的App内多语言切换机制,今天我在公司的项目中发现了Bug,结果处理了两天总算解决了。
如果你有看/article/7579735.html,这篇文章的话,估计语言切换的机制你基本了解了。这部分内容我就不解释了,先来说说Bug,Bug就是App在休眠的状态下切换屏幕重启后,配置语言变回了本机语言。这么说有点抽象,具体来说就是,[b](默认你的App必须是横屏的(pad),竖屏的话手机不可能出此问题)比如你在登录界面设置的按钮可以切换语言,你本机语言默认是简体中文,你切换到英文之后,使pad休眠并且把pad竖过来。唤醒屏幕后登录进去,发现语言转换成了中文。按道理应该是英文可显示的确实中文。[/b]
/article/1819627.html
http://blog.chinaunix.net/uid-24410388-id-3855498.html
看这两个博客应该可以了解本文需要的Android生命周期的知识了。特别是第一个!onConfigurationChanged的调用机制大家也可以去搜索下。我这里就不给了。
好,回到重点,产生这个Bug的原因如下:我之前在Android开发学习笔记秘籍(十八)中说明了我们要切换语言必须setContentView对吧,而切换屏幕在不加
就导致了语言切换出现了很严重的问题,pad一般是默认竖屏的,你的app虽然强制了横屏但是你从休眠转成唤醒的过程它一定是有屏幕切换的,甚至可能是两次屏幕切换。所以这个问题是必须得解决的!
大致的代码结构如下:
如果你有看/article/7579735.html,这篇文章的话,估计语言切换的机制你基本了解了。这部分内容我就不解释了,先来说说Bug,Bug就是App在休眠的状态下切换屏幕重启后,配置语言变回了本机语言。这么说有点抽象,具体来说就是,[b](默认你的App必须是横屏的(pad),竖屏的话手机不可能出此问题)比如你在登录界面设置的按钮可以切换语言,你本机语言默认是简体中文,你切换到英文之后,使pad休眠并且把pad竖过来。唤醒屏幕后登录进去,发现语言转换成了中文。按道理应该是英文可显示的确实中文。[/b]
Bug产生的原因:
这个问题就涉及到了基本所有的Android生命周期的问题了,我本以为对Android生命周期的理解已经算到位了,结果还是不够深刻。这里就不详述Android的生命周期了,借鉴下别人的博客./article/1819627.html
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中读出,在切换一次即可!
相关文章推荐
- android SeekBar的自定义样式设置
- Android中activity保存状态和数据到底该在哪个方法中进行
- 微信WeixinJSBridge API
- 微信内置浏览器的JsAPI(WeixinJSBridge续)[转载]
- Android的View绘制流程
- AndroidAnnotations框架的使用详解
- nagios安装
- 关于Android 使用服务器公钥RSA加密 数据到服务器RSA解密报错问题
- iOS 开发,xcode7中用QQ授权登录遇到的一些问题 QQ登录不跳客户端
- android保存文件到sd卡,读取和清空记录功能(可以用来保存用户名和密码)
- iOS开发-Socket通讯方式
- 传说中的WeixinJSBridge和微信rest接口
- Android项目中的欢迎界面和引导页:动画和ViewPager
- Android Handler机制分析
- Performing Authoritative Restore of Active Directory Objects
- Mockito中java.lang.noclassdeffounderror android/support/v4/app/taskstackbuilder$supportparentable
- Missing Gradle Project Information
- 使用AssetsLibrary库实现系统类似照片浏览器
- iOS-将经纬度转化成度分秒格式
- IE9,IE10,IE11下当Content-type为application/json时,打开接口会出现下载弹框