有的项目需要国际化,这样在语言需求方面就比较多了,所以我们需要设置语言转换,语言有很多,这里示范中英文转换。
工具:Android Studio
1、生成需要转换语种的 文件
2、语种使用设置
3、语种转换
1、生成需要转换语种的 文件
在android studio项目中,点击 鼠标右键 res > new > android Resource Directory 将会看到如下界面
选中 Locale ,将会看到如下界面
选中英文语言后点击ok,就会生成右边界面看到的 values-en 文件夹,在里面创建一个新的 文件,用来放置英文内容
如图,values 里面的 用来设置中文以及常规加载, values-en 文件夹下的 用来设置英文加载
2、语种使用设置
上面定义好语种放置位置之后就可以进行设置,让系统知道加载哪个文件夹下的语言文件
这里我们在 Application 里设置语言,代码如下:
import ;
import ;
import ;
import ;
import ;
import ;
public class MyApplication extends Application {
@Override
public void onCreate() {
();
String language = (this);
if(!("Language")){
Locale locale = ();
(this, locale,true);
}
}
}
上面的 (this) 和 () 以及 (this, locale,true)
这三个方法参考 3 语种转换
3、语种转换
因为这里只有两种语言需要切换,所以我只用了一个按钮来控制切换
代码如下:
(new () {
@Override
public void onClick(View v) {
String language = ();
if(("Language")){
(, , true);
}else{
("Language", );
}
}
});
其中 SPUtils 是我定义的一个 SharedPreferences 工具类,用来保存语言设置,代码如下
//Language
public static String getLanguage(Context context){
return share(context).getString("Language","Language");
}
//这里使用的是 apply() 方法保存,将不会有返回值
public static void setLanguage(String Language, Context context){
e = share(context).edit();
("Language",Language);
();
}
//创建
public static SharedPreferences share(Context context){
SharedPreferences sharedPreferences = ("data", Context.MODE_PRIVATE);
return sharedPreferences;
}
上面我定义的是默认为 “Language” 就是如果 SharedPreferences 里 getLanguage 里面的值为 “Language” 时,显示默认的也就是中文语言。如果当前是中文语言,就调用 LanguageUtils 语言工具类,里面的 changeAppLanguage 语言设置方法进行设置,代码如下:
import ;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* creator iscopy .
* time 2018/12/27
* 语言设置
*/
public class LanguageUtils {
/**
* 更改app语言
* @param context
* @param locale
* @param persistence
*/
public static void changeAppLanguage(Context context, Locale locale, boolean persistence) {
Resources resources = ();
DisplayMetrics metrics = ();
Configuration configuration = ();
if (.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
(locale);
} else {
= locale;
}
(configuration, metrics);
if (persistence) {
((), context);//保存设置的语言
}
}
/**
* 返回当前使用语言
* @return
*/
public static Locale getAppLocale(){
Locale locale = new Locale(());
return locale;
}
}
这样就简单的实现了语言切换的效果,效果展示:
不过,这里有一个缺陷,转换效果需要重启app才能够实现,因为数据已经加载好了,当前实时实现语言切换的需要后台数据
我们可以提示用户,需要重启APP才能实现语言切换,让用户去重启,也可以设置如下代码,在永用户同意的情况下调用,个人觉得可以使用弹框询问,如果是第一次进入时,可以在过了引导页后直接跳转跳转到语言设置去
//重启app
public void restart(){
/*//关闭app
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);*/
Intent intent = getBaseContext().getPackageManager().getLaunchIntentForPackage(getBaseContext().getPackageName());
PendingIntent restartIntent = (getApplicationContext(), 0, intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
(, (), restartIntent);
(());
}
如果有很多种语言设置也可以参照当前逻辑