国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android實現app應用多語言切換功能

2019-12-12 05:47:37
字體:
來源:轉載
供稿:網友

最近在做一個多語言切換的功能,類似于微信的語言切換,搜了下資料基本上都是以下這種:

1. 實現的效果

 

和微信類似,在設置界面打開切換語言的界面,選擇語言后重啟 HomeActivity,語言切換完成,下次重新打開 App ,也是用戶設置的語言。 

2. 實現步驟
 1). 添加多語言文件 
在不同的 value 文件夾下(例如 value 、value-en、values-zh-rTW 文件夾)添加不同語言的 string.xml 文件,我們的項目添加了英文、簡體中文、繁體中文三種語言,如下圖所示:

 

其中英文需要翻譯,繁體如果沒有專門翻譯的話,可以找個簡繁轉換網站,直接將簡體中文轉成繁體中文,我用的這個網站:在線中文簡體轉繁體。 

2). 更新 Configuration 中的 locale 屬性 
參照 Android 開發者官網 上 的描述,Configuration 包含了設備的所有的配置信息,這些配置信息會影響應用獲取的資源。例如 string 資源,就是根據 Configuration 的 locale 屬性來判斷該取哪種語言的 string 資源,默認是 value 文件夾下的。 

主要代碼如下:

Resources resources = getContext().getResources();DisplayMetrics dm = resources.getDisplayMetrics();Configuration config = resources.getConfiguration(); // 應用用戶選擇語言 config.locale = Locale.ENGLISH; resources.updateConfiguration(config, dm); 

我們用了 Locale 中的預設值 Locale.ENGLISH、Locale.TRADITIONAL_CHINESE和 Locale.SIMPLIFIED_CHINESE,如果你需要設置的語言沒有預設值,你可以自己新建一個 Locale 對象,具體自行 Google 吧。 

注:跟隨系統設置是 Locale.getDefault() 

3). 重啟 HomeActivity
 我 們的 App 有個啟動頁 WelcomeActivity,類似微信那個小人啟動頁,如果從歡迎頁重啟,并不是一個好的體驗,應該和微信的語言設置一樣,直接回到 HomeActivity ,而不是從 WelcomeActivity 重新打開。實現其實也很簡單,代碼如下: 

Intent intent = new Intent(this, HomeActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);getActivity().startActivity(intent); 

正常來說這段代碼應該是沒問題的,但是假如你的 App 存在某個 activity 和當前設置頁 activity 不在一個 task 棧內的話(比如你從某個通知頁用 FLAG_ACTIVITY_NEW_TASK 啟動的一個 activity),就不會應用語言設置。因此可以直接殺掉當前 App 的進程,保證是“整個”重啟了: 

 Intent intent = new Intent(this, HomeActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); // 殺掉進程 android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0); 

按道理殺掉進程的兩行代碼任意一行即可,但是查閱相關資料,還是兩個都加上吧,如果有詳細了解歡迎溝通。此段代碼其實參考自 CustomActivityOnCrash 開源項目,有興趣的可以研究下這個開源庫捕捉崩潰信息,重啟應用部分的代碼。

個人覺得這種重啟HomeActivity的方法太粗暴了而且體驗不好,不過貌似微信也是這么重啟了HomeActivity。一般語言切換的設置會藏的比較深,比如微信,如果一個用戶對手機操作不熟或者說對這個應用不熟,不小心切換了不知道什么語言然后給我跳回主頁,再想設回中文就麻煩咯。所以,我認為最好是切完語言立即刷新然后還是停留當前頁比較好。具體實現如下: 
1、還是要添加多語言文件,跟上面的步驟1一樣;
2、在BaseActivity中實現語言切換代碼: 

@Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    EventBus.getDefault().register(this);    changeAppLanguage();  } 
public void changeAppLanguage() {     String sta = Store.getLanuageIsChinese() ? "zh" : "en";//這是SharedPreferences工具類,用于保存設置,代碼很簡單,自己實現吧     // 本地語言設置     Locale myLocale = new Locale(sta);     Resources res = getResources();     DisplayMetrics dm = res.getDisplayMetrics();     Configuration conf = res.getConfiguration();     conf.locale = myLocale;     res.updateConfiguration(conf, dm);   } 
 public void onEvent(String str) {     switch (str) {       case Constant.EVENT_REFRESH_LANGUAGE:         changeAppLanguage();         recreate();//刷新界面         break;    }  } 
 @Override   protected void onDestroy() {    super.onDestroy();     EventBus.getDefault().unregister(this);  } 

3、設置界面中的實現自然就是更新sharedPreferences 中的設置,然后發送EventBus就行啦     

 if () {//中文       Store.setLanuageIsChinese(true);     } else if () {//英文       Store.setLanuageIsChinese(false);     }     EventBus.getDefault().post(Constant.EVENT_REFRESH_LANGUAGE);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 克山县| 墨玉县| 方正县| 陈巴尔虎旗| 老河口市| 洪江市| 北安市| 西峡县| 类乌齐县| 阿拉善盟| 桂平市| 织金县| 宁河县| 定结县| 黑水县| 杨浦区| 同心县| 松原市| 进贤县| 若羌县| 呼图壁县| 淳安县| 遂川县| 洪泽县| 鱼台县| 金昌市| 曲松县| 资阳市| 尼勒克县| 宿松县| 涞水县| 增城市| 龙海市| 镶黄旗| 苍梧县| 德阳市| 珠海市| 兴城市| 新郑市| 新竹县| 屯昌县|