編輯:關於android開發
最近在做一個多語言切換的功能,類似於微信的語言切換,搜了下資料基本上都是以下這種:
和微信類似,在設置界面打開切換語言的界面,選擇語言後重啟 HomeActivity,語言切換完成,下次重新打開 App ,也是用戶設置的語言。
在不同的 value 文件夾下(例如 value 、value-en、values-zh-rTW 文件夾)添加不同語言的 string.xml
文件,我們的項目添加了英文、簡體中文、繁體中文三種語言,如下圖所示:
其中英文需要翻譯,繁體如果沒有專門翻譯的話,可以找個簡繁轉換網站,直接將簡體中文轉成繁體中文,我用的這個網站:在線中文簡體轉繁體。
參照 Android 開發者官網 上 的描述,Configuration 包含了設備的所有的配置信息,這些配置信息會影響應用獲取的資源。例如 string 資源,就是根據 Configuration 的 locale 屬性來判斷該取哪種語言的 string 資源,默認是 value 文件夾下的。
主要代碼如下:
1 Resources resources = getContext().getResources(); 2 DisplayMetrics dm = resources.getDisplayMetrics(); 3 Configuration config = resources.getConfiguration(); 4 // 應用用戶選擇語言 5 config.locale = Locale.ENGLISH; 6 resources.updateConfiguration(config, dm);
我們用了 Locale
中的預設值 Locale.ENGLISH
、Locale.TRADITIONAL_CHINESE
和 Locale.SIMPLIFIED_CHINESE
,如果你需要設置的語言沒有預設值,你可以自己新建一個 Locale
對象,具體自行 Google 吧。
注:跟隨系統設置是 Locale.getDefault()
我 們的 App 有個啟動頁 WelcomeActivity,類似微信那個小人啟動頁,如果從歡迎頁重啟,並不是一個好的體驗,應該和微信的語言設置一樣,直接回到 HomeActivity ,而不是從 WelcomeActivity 重新打開。實現其實也很簡單,代碼如下:
1 Intent intent = new Intent(this, HomeActivity.class); 2 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 3 getActivity().startActivity(intent);
正常來說這段代碼應該是沒問題的,但是假如你的 App 存在某個 activity 和當前設置頁 activity 不在一個 task 棧內的話(比如你從某個通知頁用 FLAG_ACTIVITY_NEW_TASK
啟動的一個 activity),就不會應用語言設置。因此可以直接殺掉當前 App 的進程,保證是“整個”重啟了:
1 Intent intent = new Intent(this, HomeActivity.class); 2 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); 3 startActivity(intent); 4 // 殺掉進程 5 android.os.Process.killProcess(android.os.Process.myPid()); 6 System.exit(0);
按道理殺掉進程的兩行代碼任意一行即可,但是查閱相關資料,還是兩個都加上吧,如果有詳細了解歡迎溝通。此段代碼其實參考自 CustomActivityOnCrash 開源項目,有興趣的可以研究下這個開源庫捕捉崩潰信息,重啟應用部分的代碼。
個人覺得這種重啟HomeActivity的方法太粗暴了而且體驗不好,不過貌似微信也是這麼重啟了HomeActivity。一般語言切換的設置會藏的比較深,比如微信,如果一個用戶對手機操作不熟或者說對這個應用不熟,不小心切換了不知道什麼語言然後給我跳回主頁,再想設回中文就麻煩咯。所以,我認為最好是切完語言立即刷新然後還是停留當前頁比較好。具體實現如下:
1、還是要添加多語言文件,跟上面的步驟1一樣;
2、在BaseActivity中實現語言切換代碼:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EventBus.getDefault().register(this); changeAppLanguage(); }
1 public void changeAppLanguage() { 2 String sta = Store.getLanuageIsChinese() ? "zh" : "en";//這是SharedPreferences工具類,用於保存設置,代碼很簡單,自己實現吧 3 // 本地語言設置 4 Locale myLocale = new Locale(sta); 5 Resources res = getResources(); 6 DisplayMetrics dm = res.getDisplayMetrics(); 7 Configuration conf = res.getConfiguration(); 8 conf.locale = myLocale; 9 res.updateConfiguration(conf, dm); 10 }
1 public void onEvent(String str) { 2 switch (str) { 3 case Constant.EVENT_REFRESH_LANGUAGE: 4 changeAppLanguage(); 5 recreate();//刷新界面 6 break; 7 } 8 }
1 @Override 2 protected void onDestroy() { 3 super.onDestroy(); 4 EventBus.getDefault().unregister(this); 5 }
3、設置界面中的實現自然就是更新sharedPreferences 中的設置,然後發送EventBus就行啦
1 if () {//中文 2 Store.setLanuageIsChinese(true); 3 } else if () {//英文 4 Store.setLanuageIsChinese(false); 5 } 6 EventBus.getDefault().post(Constant.EVENT_REFRESH_LANGUAGE);
基本思路就是這樣,如果還有什麼更好的方法,敬請給俺留言,讓我膜拜一下。
Android Studio教程--從Github 下載一個Repository,androidgithub從電腦上徹底刪除HelloWorld項目 回到as歡迎頁面
Android快樂貪吃蛇游戲實戰項目開發教程-05虛擬方向鍵(四)四個三角形按鈕,android-05該系列教程概述與目錄:http://www.cnblogs.com/
本節講解使用SurfaceView組件繪制動畫的方法。SurfaceView類
Android中AlarmManager使用示例(持續更新,已經更改),alarmmanager現在普遍的手機都會有一個鬧鐘的功能,如果使用Android來實現一個鬧鐘可