Android开发在做国际化的时候需要做多语言的适配,首先我们通过手机设置来看一下当前手机系统的语言环境,我用的是Android7.1.1的系统,相信语言切换大家都很容易找到,本博客还做了保存语言更改状态,就是当你设置英文或中文状态后,退出应用再打开,还是你上一次设置的语言环境.
现在我们通过代码的方式获取当前手机系统的语言环境
private String getLocaleLanguage(){
Locale locale = getResources().getConfiguration().locale;
String language = locale.getLanguage();
return language;
}
//下面这段写在onCreate方法内,这里做示例
String currentLanguage = getLocaleLanguage();
Log.d(TAG,"currentLanguage="+ currentLanguage);
打印日志,当你选择当前手机系统语言为英文时,可以看到"en"代表英文,当你选择为中文时,"zh"代表中文
现在我写一个简单的界面,布局代码就不贴了,两个TextView和一个Button,当我点击Button的时候切换语言
现在要准备一个资源文件,在res目录下创建values-zh-rCN文件夹,文件夹内创建strings.xml,用于放引用的字符串资源, 英文的就不用创建了,因为自带的values文件夹下的strings.xml默认就是英文的
然后把当前resources资源下的内容复制粘贴到values文件夹下的strings.xml内,并把内容改为英文的
资源准备好后,设置语言
private void setLanguage(Locale language){
Resources resources = getBaseContext().getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
Configuration config = resources.getConfiguration();
// 应用用户选择语言
config.locale = language;
resources.updateConfiguration(config, dm);
Toast.makeText(MainActivity.this,R.string.now_change_language,Toast.LENGTH_SHORT).show();
//刷新界面
Intent intent = new Intent();
intent.setClass(MainActivity.this,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
MainActivity.this.startActivity(intent);
}
点击button后切换语言
mBtnChangeLanguage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(currentLanguage.equals("en")){
//当前为英文环境就切换为中文
setLanguage(Locale.CHINESE);
}else if(currentLanguage.equals("zh")){
//当前为中文环境就切换为英文
setLanguage(Locale.ENGLISH);
}
}
});
最终就可以实现两种语言之间切换了,当然还要切换为其他国家的语言原理也相同,效果如下面两张图
现在我们来解决一个保存语言状态的问题,比如我现在的是英文状态,我改为中文状态,退出后再进入应用又变为英文状态了.我们可以通过SharedPreferences保存状态,自定义Application类,获取上一次保存的语言状态,然后再设置,Application为应用的入口,其他关于Application和SharedPreferences的知识不在这里赘述.
我这里把SharedPreferences封装成了一个工具类,可以直接存取数据.因为SharedPreferences不能直接存储对象,想要存储的话需要转换,比较麻烦,所以我就直接获取当前的语言环境,因为获取的当前语言环境是String类型,这样就可以轻松把当前语言存进去了.
mBtnChangeLanguage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(currentLanguage.equals("en")){
//当前为英文环境就切换为中文
setLanguage(Locale.CHINESE);
PreferenceUtils.putString(MainActivity.this,"savedLanguage",getLocaleLanguage());
}else if(currentLanguage.equals("zh")){
//当前为中文环境就切换为英文
setLanguage(Locale.ENGLISH);
PreferenceUtils.putString(MainActivity.this,"savedLanguage",getLocaleLanguage());
}
}
});
自定义Application别忘了在清单文件application节点下注册该自定义类,现在我们就可以直接从自定义的Application取之前保存的语言,然后设置上去就OK了
public class BaseApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
initLanguage();//初始化语言
}
/** 初始化语言,获取最后一次保存的语言并且设置,确保每次打开应用都是最后一次设置的语言环境 */
private void initLanguage() {
String savedLanguage = PreferenceUtils.getString(getBaseContext(), "savedLanguage");
if (savedLanguage != null) {
if (savedLanguage.equals("en")) {
setLanguage(Locale.ENGLISH);
} else if (savedLanguage.equals("zh")) {
setLanguage(Locale.CHINESE);
}
}
}
/**
* 设置语言
*/
private void setLanguage(Locale language) {
Resources resources = getBaseContext().getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
Configuration config = resources.getConfiguration();
config.locale = language;
resources.updateConfiguration(config, dm);
}
}
现在每次设置语言,退出后重新打开就是上次设置的语言环境了.
最后还可以做一些屏幕的适配,比如旋转屏幕后生命周期重新启动的问题,在每个清单文件中每个Activity加 android:configChanges="locale"
和application相同节点下配置supports-screens,让你的layout适应屏幕的大小,包括平板电脑
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true"/>
最后附上该类的完整代码,以上实例如有不足请指出.
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private Button mBtnChangeLanguage;
private String currentLanguage;
private Button mToSecond;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
currentLanguage = getLocaleLanguage();
mBtnChangeLanguage = (Button) findViewById(R.id.btn_change);
mBtnChangeLanguage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(currentLanguage.equals("en")){
setLanguage(Locale.CHINESE); //当前为英文环境就切换为中文
PreferenceUtils.putString(MainActivity.this,"savedLanguage",getLocaleLanguage());
}else if(currentLanguage.equals("zh")){
setLanguage(Locale.ENGLISH); //当前为中文环境就切换为英文
PreferenceUtils.putString(MainActivity.this,"savedLanguage",getLocaleLanguage());
}
}
});
mToSecond = (Button) findViewById(R.id.btn_to_second);
mToSecond.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
/** 获取当前语言环境 */
private String getLocaleLanguage(){
Locale locale = getResources().getConfiguration().locale;
String language = locale.getLanguage();
return language;
}
/** 设置语言 */
private void setLanguage(Locale language){
Resources resources = getBaseContext().getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
Configuration config = resources.getConfiguration();
config.locale = language;
resources.updateConfiguration(config, dm);
//刷新界面
Intent intent = new Intent();
intent.setClass(MainActivity.this,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
MainActivity.this.startActivity(intent);
}
}