Android开发学习笔记秘籍(十八)
2016-03-31 17:48
495 查看
实习阶段,学长安排了一个任务要求我对一个已完成的APP添加一个多语言切换的功能。本以为会很轻松的搞定,最后竟然忙活了我一早上!不过还是很庆幸最后完成了。
本以为多语言切换的教程会很多也很容易实现,但没想到都与理想效果有差距。理想效果是选择切换某种语言后,本页面刷新,转换为选择的语言然后选择其他页面显示的也是选择的语言,这里有一点要说明,我这里只是改变了App内的语言,本机的语言是没有改变的(本机语言就是你在“设置”里面的设置的)
在不点击Change Language时,跳转到别的界面显示的还是英文,但点击了切换语言后,不仅当前页面的语言变成了中文,跳转到别的语言也是中文。
界面布局要说的可不是activity_main,activity_main的布局很简单,几个TextView和几个Button组成就是了,这里主要说的是string.xml的布局,要实现多语言的切换就要设置多个string.xml,但string.xml的设置又不是那么的随便,这里的/article/1813372.html介绍了Android
studio设置多个string.xml,很详细,后面的不就不敢恭维了,我按照他的来失败了。
对吧,神奇吧。App会根据你本机的语言来选择需要加载的string.xml。但这操作也太特么蛋疼了吧,换个语言还把我全机的语言换了,简直了!所以我们还需要改进。
那实现上面效果的代码是怎么样的呢?没错,网上大家搜到的多语言切换的主代码都基本是这个:
我用的也是这个,但大家如果直接照这网上这样来我觉得多半会出现和我一样的问题,就是没效果,无论你AndroidMainifest.xml中有没有设置
我自己测试的时候确实没有效果,不然也不至于搞一早上。问题出在哪里呢?贴代码和效果给大家看看:
setLocale()的代码已经贴在上面了,我改了一个地方就是把它设置成转换成中文而已(不用参数了),效果我就不放图了,效果是就是新打开的MainActivity并没有切换语言,但你把setLocale()后面两句换掉,换成setContentView(R.layout.activity_main)的话,恭喜你,你可以看到语言切换了,但最大的问题出现了,你重新setContentView一遍后,按钮不能点了!!!因为你onCreate里setContentView时初始化了Button,它们还指向原来Button,所以点击无效,除非你再来一遍视图的findViewById,我这里之所以重开一遍MainActivity正是这个原因(为了执行setContentView,又不用再来一遍findViewById),但为什么没有效果我不得而知,如果有哪位大神不小心看到这篇文章请务必告诉我原因,(我猜是updateConfiguration这个函数的锅,想知道估计得研究源码)。
在搜索了不少有测试了不少代码后,最后只有下面这种成功了,代码如下:
这里调用了onConfigurationChanged的方法,成功的修改了config并更新成功,但奇怪的是什么呢?它主要的代码还是setLocale()但就是成功了......
本以为多语言切换的教程会很多也很容易实现,但没想到都与理想效果有差距。理想效果是选择切换某种语言后,本页面刷新,转换为选择的语言然后选择其他页面显示的也是选择的语言,这里有一点要说明,我这里只是改变了App内的语言,本机的语言是没有改变的(本机语言就是你在“设置”里面的设置的)
效果:
效果如下:在不点击Change Language时,跳转到别的界面显示的还是英文,但点击了切换语言后,不仅当前页面的语言变成了中文,跳转到别的语言也是中文。
界面布局:
界面布局要说的可不是activity_main,activity_main的布局很简单,几个TextView和几个Button组成就是了,这里主要说的是string.xml的布局,要实现多语言的切换就要设置多个string.xml,但string.xml的设置又不是那么的随便,这里的/article/1813372.html介绍了Androidstudio设置多个string.xml,很详细,后面的不就不敢恭维了,我按照他的来失败了。
重要代码:
其实在完成多个string.xml的设置后你的App就已经具备多语言切换的功能了只是操作复杂了点,你得去“设置”里面去设置本机语言还是贴张图看看吧对吧,神奇吧。App会根据你本机的语言来选择需要加载的string.xml。但这操作也太特么蛋疼了吧,换个语言还把我全机的语言换了,简直了!所以我们还需要改进。
那实现上面效果的代码是怎么样的呢?没错,网上大家搜到的多语言切换的主代码都基本是这个:
public void setLocale(String lang) { myLocale = new Locale(lang); Resources res = getResources(); DisplayMetrics dm = res.getDisplayMetrics(); Configuration conf = res.getConfiguration(); conf.locale = myLocale; res.updateConfiguration(conf, dm); }
我用的也是这个,但大家如果直接照这网上这样来我觉得多半会出现和我一样的问题,就是没效果,无论你AndroidMainifest.xml中有没有设置
android:configChanges="locale"(上面这个在Activity这个标签下设置)
我自己测试的时候确实没有效果,不然也不至于搞一早上。问题出在哪里呢?贴代码和效果给大家看看:
btn_refresh.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setLocale(); Intent intent = new Intent(MainActivity.this, MainActivity.class); startActivity(intent); } }); login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, Language.class); startActivity(intent); } }); }
setLocale()的代码已经贴在上面了,我改了一个地方就是把它设置成转换成中文而已(不用参数了),效果我就不放图了,效果是就是新打开的MainActivity并没有切换语言,但你把setLocale()后面两句换掉,换成setContentView(R.layout.activity_main)的话,恭喜你,你可以看到语言切换了,但最大的问题出现了,你重新setContentView一遍后,按钮不能点了!!!因为你onCreate里setContentView时初始化了Button,它们还指向原来Button,所以点击无效,除非你再来一遍视图的findViewById,我这里之所以重开一遍MainActivity正是这个原因(为了执行setContentView,又不用再来一遍findViewById),但为什么没有效果我不得而知,如果有哪位大神不小心看到这篇文章请务必告诉我原因,(我猜是updateConfiguration这个函数的锅,想知道估计得研究源码)。
在搜索了不少有测试了不少代码后,最后只有下面这种成功了,代码如下:
btn_refresh.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Configuration newConfig = new Configuration(); newConfig.locale = Locale.SIMPLIFIED_CHINESE; onConfigurationChanged(newConfig); Intent intent = new Intent(MainActivity.this, MainActivity.class); startActivity(intent); } }); login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, Language.class); startActivity(intent); } }); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics()); // setContentView(R.layout.activity_main); Log.e("哈哈哈哈哈哈哈","onConfigurationChanged had done"); }
这里调用了onConfigurationChanged的方法,成功的修改了config并更新成功,但奇怪的是什么呢?它主要的代码还是setLocale()但就是成功了......
注意事项:
updateConfiguration之后一定要setContentView,原因就是setContenView就是需要把string,xml的数据读出来,填充视图所以当你修改好了Config之后一定要记得setContentView,而单纯的setContentView会导致onCreate中设置的控件初始化出现无效的结果。源码下载:
http://download.csdn.net/detail/cuihaoren01/9478262相关文章推荐
- [置顶] Android Studio中Gradle版本和Gradle插件版本问题整理
- android处理空ListView
- Android设计模式 单例模式(静态内部类单例模式)
- Android自定义ListView Scrollbar样式
- android: 调用摄像头拍照
- Android中内容观察者的使用---- ContentObserver类详解
- android: 将程序运行到手机上
- android: 接收和发送短信
- Android App中实现简单的刮刮卡抽奖效果的实例详解
- Android 快速开发框架之——AndroidFine
- MAC上添加ADB环境变量
- Android设置透明、半透明等效果
- android adb端口被占用解决方案
- android launchmode 使用场景
- android: 使用通知
- 深入理解Android之Gradle
- Android Glide Google 推荐加载图片框架(加载图片详解篇)
- 关于Android使用 share绘制虚线却在手机上显示实线问题
- Android蓝牙开发详解
- Android AlarmManager实现不间断轮询服务