功能:
app用戶根據自己的語言喜好,設置app語言。語言設置只針對本app,並在下次啓動應用時保留前一次啓動設置。
1.先去查看下
各國語言縮寫-各國語言簡稱,世界各國域名縮寫
2.在工程res文件下添加對應語種的values文件,ar:阿拉伯語,
en:英語 zh_rCN: 簡體中文
截圖如下:
在strings.xml和arrays.xml需要國際化的字符串進行相應得翻譯
更新語言:
public void chooseLanguage(Locale locale) {
Resources resources = getResources();// 獲得res資源對象
Configuration config = resources.getConfiguration();// 獲得設置對象
DisplayMetrics dm = resources.getDisplayMetrics();// 獲得屏幕參數:主要是分辨率,像素等。
config.locale = locale;
resources.updateConfiguration(config, dm);
this.finish();// 重啓。
startActivity(new Intent(activity, TranAActivity.class));
}
Locale中已經有定義好的語種相關的Locale:CHINA CHINESE US
像阿拉伯語沒有的話就得 new
Locale(
"ar"
);
可以再Activity的
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Resources resources = getResources();//獲得res資源對象
Configuration config = resources.getConfiguration();//獲得設置對象
DisplayMetrics dm2 = resources.getDisplayMetrics();//獲得屏幕參數:主要是分辨率,像素等。
config.locale =new Locale("ar");
resources.updateConfiguration(config, dm2);
//在setContentView方法之前設置
setContentView(R.layout.activity_tran_main);
}
sharePreferences存入設置語言:
SharencessharedPreferences = getActivity().getSharedPrefeivity().getPackageName(), 0);
sharedPreferences.edit().putString("language", lanAtr).commit();
語言更新後,對於之前出現且目前仍舊存活的activity,語言設置是不生效的。可以通過重啓對應的activity,讓語言及時生效。
private void restart() {
Intentit = new Intent(getActivity(), MainActivity.class); //MainActivity是你想要重啓的activity
it.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getActivity().startActivity(it);
}
NOTE:
• 一般,從用戶體驗角度講,語言設置功能入口會放在App的前幾層,如果入口太深,導致用戶無法快速找到語言設置入口,並且如果要講應用重啓的話,用戶行爲操作記錄會比較麻煩。
• 重啓對應Activity有幾種方式:
◦ 如果用戶進入語言設置需要太多的層級,或者在操作語言設置之前操作的其他行爲,APP想保存的,那可以通過廣播的方式(sendBroadcast()),語言改變時發送廣播,所有activity接受到廣播後(BroadcastReceiver),都進行重啓操作;
◦ 如果允許用戶設置語言後,app回到主目錄,這樣就簡單很多,直接調用上面的restart()方法即可。
重啓singleTask activity:
如果你的啓動activity是singleTask,向上面那樣重啓,語言還是不生效的。這種情況如何呢?可以通過了解、利用其生命週期來解決,在切回singleTask屬性的activity時,activity會調用onNewIntent()方法。重寫該方法就可以。以下是一種解決方法,先finish自己,然後重啓自己。
@Override
protectedvoid onNewIntent(Intent intent) {
if (intent.getAction() == null) {
finish();
Intenti = new Intent(this, MainActivity.class);
startActivity(i);
//overridePendingTransition(0, 0);
} else {
//其他邏輯
}
}
結束語:
APP語言設置不復雜,主要是如何將語言設置及時生效,涉及activity重啓,廣播等。