首先扯點(diǎn)別的:這是第一次在簡書上寫東西,我突然明白為啥這么多人在簡書上寫東西了隔嫡,因?yàn)闆]有廣告啊涂屁,哈哈书在。
最近接觸到Android 應(yīng)用內(nèi)切換語言的問題,研究了兩天拆又,做個記錄先儒旬。實(shí)現(xiàn)了中文,英文帖族,泰語的切換栈源。測試機(jī)器 Nexus5(Android p),HUAWEI榮耀9青春版(8.0.0),XIAOMI mi 4LTE(6.0.1)竖般∩蹩眩看下效果
完整的例子在底部
實(shí)現(xiàn)步驟
首先需要新建對應(yīng)語言環(huán)境下的資源文件
對于Android7.0及以上版本
定義一個BaseActivity,重寫attachBaseContext方法,在此方法里進(jìn)行語言切換
public class BaseActivity extends AppCompatActivity {
/**
* 此方法先于 onCreate()方法執(zhí)行
* @param newBase
*/
@Override
protected void attachBaseContext(Context newBase) {
//獲取我們存儲的語言環(huán)境 比如 "en","zh",等等
String language = SpUtil.getInstance(App.getContext()).getString(SpUtil.LANGUAGE);
//attach 對應(yīng)語言環(huán)境下的context
super.attachBaseContext(LanguageUtil.attachBaseContext(newBase, language));
}
}
LanguageUtil中的attachBaseContext()方法
public static Context attachBaseContext(Context context, String language) {
Log.d(TAG, "attachBaseContext: "+Build.VERSION.SDK_INT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return updateResources(context, language);
} else {
return context;
}
}
@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) {
Resources resources = context.getResources();
Locale locale = LanguageUtil.getLocaleByLanguage(language);
Configuration configuration = resources.getConfiguration();
configuration.setLocale(locale);
configuration.setLocales(new LocaleList(locale));
return context.createConfigurationContext(configuration);
}
在attachBaseContext()方法中,我們判斷一下艰亮,如果當(dāng)前api大于24闭翩,那么就調(diào)用updateResources()方法更新context。
定義好BaseActivity以后迄埃,我們只需要讓我們的Activity都繼承這個基類即可疗韵。
對于Android7.0及以下版本
自定義Application并在AndroidManifest.xml文件中聲明,在Application的onCreate()方法中,調(diào)用更換語言的方法即可侄非。
public class App extends Application {
private static Context context;
private final String TAG = getClass().getSimpleName();
@Override
public void onCreate() {
super.onCreate();
context = this;
/**
* 對于7.0以下蕉汪,需要在Application創(chuàng)建的時候進(jìn)行語言切換
*/
String language = SpUtil.getInstance(this).getString(SpUtil.LANGUAGE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
LanguageUtil.changeAppLanguage(App.getContext(), language);
}
}
public static Context getContext() {
return context;
}
}
LanguageUtil中的changeAppLanguage方法
/**
* @param context
* @param newLanguage 想要切換的語言類型 比如 "en" ,"zh"
*/
@SuppressWarnings("deprecation")
public static void changeAppLanguage(Context context, String newLanguage) {
if (TextUtils.isEmpty(newLanguage)) {
return;
}
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
//獲取想要切換的語言類型
Locale locale = getLocaleByLanguage(newLanguage);
configuration.setLocale(locale);
// updateConfiguration
DisplayMetrics dm = resources.getDisplayMetrics();
resources.updateConfiguration(configuration, dm);
}
經(jīng)過上面的操作就可以在7.0以下實(shí)現(xiàn)應(yīng)用內(nèi)切換語言。
手動切換語言
定義一個ChangeLanguageActivity
public void onClick(View view) {
String language = null;
switch (view.getId()) {
case R.id.btn_chinese:
//切換為簡體中文
language = LanguageType.CHINESE.getLanguage();
break;
case R.id.btn_english:
//切換為英語
language = LanguageType.ENGLISH.getLanguage();
break;
case R.id.btn_thailand:
//切換為泰語
language = LanguageType.THAILAND.getLanguage();
break;
default:
break;
}
changeLanguage(language);
}
/**
* 如果是7.0以下逞怨,我們需要調(diào)用changeAppLanguage方法者疤,
* 如果是7.0及以上系統(tǒng),直接把我們想要切換的語言類型保存在SharedPreferences中,然后重新啟動MainActivity即可
* @param language
*/
private void changeLanguage(String language) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
LanguageUtil.changeAppLanguage(App.getContext(), language);
}
SpUtil.getInstance(this).putString(SpUtil.LANGUAGE, language);
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
}
如果是7.0以下叠赦,我們需要調(diào)用changeAppLanguage方法驹马, 如果是7.0及以上系統(tǒng),直接把我們想要切換的語言類型保存在SharedPreferences中,然后重新啟動MainActivity即可眯搭。
如果控件尺寸固定,當(dāng)切換語言的時候业岁,文字長短發(fā)生變化如何解決鳞仙?
可以使用google提供的新特性來解決。
Autosizing TextViews
完整的例子請移步
https://github.com/humanheima/InternationalizationDemo
參考鏈接:
1.http://www.reibang.com/p/32ff13db1f0d#comment-24575608
2.http://www.cnblogs.com/travellife/p/Android-ying-yong-nei-duo-yu-yan-qie-huan.html
3.https://yanlu.me/android-7-0-app-language-switch/
4.https://github.com/captain-miao/MultiLanguagesSwitch
5.https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview