您的位置:首页 > 移动开发 > Android开发

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,很详细,后面的不就不敢恭维了,我按照他的来失败了。

重要代码:

其实在完成多个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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: