实习阶段,学长安排了一个任务要求我对一个已完成的APP添加一个多语言切换的功能。本以为会很轻松的搞定,最后竟然忙活了我一早上!不过还是很庆幸最后完成了。
本以为多语言切换的教程会很多也很容易实现,但没想到都与理想效果有差距。理想效果是选择切换某种语言后,本页面刷新,转换为选择的语言然后选择其他页面显示的也是选择的语言,这里有一点要说明,我这里只是改变了App内的语言,本机的语言是没有改变的(本机语言就是你在“设置”里面的设置的)
效果:
效果如下:
在不点击Change Language时,跳转到别的界面显示的还是英文,但点击了切换语言后,不仅当前页面的语言变成了中文,跳转到别的语言也是中文。
界面布局:
重要代码:
对吧,神奇吧。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()但就是成功了......
注意事项:
源码下载:
http://download.csdn.net/detail/cuihaoren01/9478262