APP语言设置
Android 系統語言切換監聽和設置
標簽:?string國際化語言 2016-08-18 10:13?1300人閱讀?評論(2)?收藏?舉報 ?分類: android(26)?版權聲明:本文為博主原創文章,未經博主允許不得轉載。
目錄(?)[+]
最近項目上產品經理提了個需求,要求關閉語言國際化,不管手機系統設置那個國家的語言,都要顯示漢語,好吧,既然有需求,那就做吧。但是項目中已經有英文的配置了,且是作為默認String提供的,這么多翻譯好的文字,直接刪除掉替換成中文為默認String又感覺棄之可惜。故網上Google下解決方案。就開始往下看吧。
一、代碼中動態設置應用顯示語言(手動控制使用values-zh-rCN下字符串)
這個方法是通過改變Resource中的配置來實現的,代碼如下: public static void initAppLanguage(Context context) {if (context == null) {return; }Locale.setDefault(Locale.CHINA); Configuration config = context.getResources().getConfiguration(); config.locale = Locale.CHINA; context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); } 上面方法我們可以在MyApplication中設置也可以在Activity的基類中調用 但是上面的方法還是不足以讓我們的應用一直顯示指定的某種語言文字的。因為我們的應用在運行階段中,系統語言發生了改變后,我們的應用還是會被切換語言的,如果沒有指定語言,就顯示默認的語言。這肯定不是我們要看到的結果,那就到了標題中提到的語言切換監聽了。二、語言切換監聽
1.廣播方式監聽
我們可以通過監聽系統廣播來實現(廣播靜態注冊動態注冊都可以,動態注冊把握好注冊時機) /** * ClassName: LocaleChangeReceiver * Description:(這里用一句話描述這個類的作用) * Created by chensf on 2016-8-17 16:47. */ public class LocaleChangeReceiver extends BroadcastReceiver {@Override public void onReceive(Context context, Intent intent) {Log.v(TAG, "mReceiver onReceive intent.getAction(): "+intent.getAction()); if(intent.getAction().equals(Intent.ACTION_LOCALE_CHANGED)) {Log.e("LocaleChangeReceiver","Language change"); SystemUtil.initAppLanguage(context); }} }這里我們通過監聽Intent.ACTION_LOCALE_CHANGED廣播,在系統語言切換后我們會得到通知,然后就愛干嘛干嘛了,這里我通過調用上面 提到的設置語言方法,將語言設置為初始設定語言。網上大多都是采用這種方式來監聽語言切換,其實還有另外一種方式。
2.重寫onConfigurationChanged方法
一些系統設置變化后都會回調這個方法,所以我們可以從這里下手。 那在哪里重寫這個方法呢,這個方法大家是不是感覺很熟悉,監聽橫豎屏切換是不是有用到過呢,提到橫豎屏切換,這里順便講點題外話 在橫豎屏切換的時候,我們為了避免Activity重新調用onCreate,一般都會重寫這個方法,但是,橫豎屏切換后Activity沒有調用onConfigurationChanged而是依舊調用了 onCreate,因為我們Activity默認是不回調onConfigurationChanged的,開啟方法就是 <activity android:name=".MainActivity" android:configChanges="orientation|screenSize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 在AndroidManifest中Activity標簽下添加android:configChanges="orientation|screenSize,orientation是橫豎屏切換的配置,至于為什么要同時加上screenSize,是因為Android3.0之后,如果只設置orientation沒有設置screenSize,onConfigurationChanged依舊不會被回調。 那回歸正題,大家通過上面的例子知道了這個onConfigurationChanged要在Activity中重寫,配置跟上面一致,參數改變了而已 <activity android:name=".MainActivity" android:configChanges="locale|layoutDirection"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>android:configChanges="locale|layoutDirection 這里同樣存在一個問題,4.2之前的系統只需要設置locale,4.2+就得多設置layoutDirection這個配置,不然onConfigurationChanged依舊不會被回調。
上面的在Activity重寫onConfigurationChanged方式明顯存在一個缺點,如果只需要改變某個Activity的語言設置,上面的方式可以適用,如果要改變整個應用的語言設置,上面的方式就很low,要每個Activity都重寫onConfigurationChanged,雖然可以在Activity基類中重寫,但是,AndroidManifest中還是得每個Activity標簽下都去設置 android:configChanges="locale|layoutDirection, 說了這么多就不繞彎子了,我們可以在Application中重寫onConfigurationChanged @Override public void onConfigurationChanged(Configuration newConfig) {Log.e("MyApplication","onConfigurationChanged"); super.onConfigurationChanged(newConfig); SystemUtil.initAppLanguage(getBaseContext()); } 這個配置是整個應用設置的,在這里設置語言,能夠改變整個應用的語言設置,而且這種方式,無需在AndroidManifest中增加配置,我測試過,在Application中重寫onConfigurationChanged,Activity的onConfigurationChanged
依舊能夠回調到,但是其中有沒有造成什么影響,我這里暫時沒有發現。如果有采用我提供的這種方式實現語言切換監聽的,遇到問題可以告訴我,我們一起探討下。
好了,本文到此結束。
總結
- 上一篇: 关于优酷开放SDk之setOnVideo
- 下一篇: Andorid App内部跟随熊语言改变