APP语言设置
Android 系統(tǒng)語言切換監(jiān)聽和設(shè)置
標(biāo)簽:?string國際化語言 2016-08-18 10:13?1300人閱讀?評論(2)?收藏?舉報 ?分類: android(26)?版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
目錄(?)[+]
最近項目上產(chǎn)品經(jīng)理提了個需求,要求關(guān)閉語言國際化,不管手機系統(tǒng)設(shè)置那個國家的語言,都要顯示漢語,好吧,既然有需求,那就做吧。但是項目中已經(jīng)有英文的配置了,且是作為默認(rèn)String提供的,這么多翻譯好的文字,直接刪除掉替換成中文為默認(rèn)String又感覺棄之可惜。故網(wǎng)上Google下解決方案。就開始往下看吧。
一、代碼中動態(tài)設(shè)置應(yīng)用顯示語言(手動控制使用values-zh-rCN下字符串)
這個方法是通過改變Resource中的配置來實現(xiàn)的,代碼如下: 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中設(shè)置也可以在Activity的基類中調(diào)用 但是上面的方法還是不足以讓我們的應(yīng)用一直顯示指定的某種語言文字的。因為我們的應(yīng)用在運行階段中,系統(tǒng)語言發(fā)生了改變后,我們的應(yīng)用還是會被切換語言的,如果沒有指定語言,就顯示默認(rèn)的語言。這肯定不是我們要看到的結(jié)果,那就到了標(biāo)題中提到的語言切換監(jiān)聽了。二、語言切換監(jiān)聽
1.廣播方式監(jiān)聽
我們可以通過監(jiān)聽系統(tǒng)廣播來實現(xiàn)(廣播靜態(tài)注冊動態(tài)注冊都可以,動態(tài)注冊把握好注冊時機) /** * 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); }} }這里我們通過監(jiān)聽Intent.ACTION_LOCALE_CHANGED廣播,在系統(tǒng)語言切換后我們會得到通知,然后就愛干嘛干嘛了,這里我通過調(diào)用上面 提到的設(shè)置語言方法,將語言設(shè)置為初始設(shè)定語言。網(wǎng)上大多都是采用這種方式來監(jiān)聽語言切換,其實還有另外一種方式。
2.重寫onConfigurationChanged方法
一些系統(tǒng)設(shè)置變化后都會回調(diào)這個方法,所以我們可以從這里下手。 那在哪里重寫這個方法呢,這個方法大家是不是感覺很熟悉,監(jiān)聽橫豎屏切換是不是有用到過呢,提到橫豎屏切換,這里順便講點題外話 在橫豎屏切換的時候,我們?yōu)榱吮苊釧ctivity重新調(diào)用onCreate,一般都會重寫這個方法,但是,橫豎屏切換后Activity沒有調(diào)用onConfigurationChanged而是依舊調(diào)用了 onCreate,因為我們Activity默認(rèn)是不回調(diào)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標(biāo)簽下添加android:configChanges="orientation|screenSize,orientation是橫豎屏切換的配置,至于為什么要同時加上screenSize,是因為Android3.0之后,如果只設(shè)置orientation沒有設(shè)置screenSize,onConfigurationChanged依舊不會被回調(diào)。 那回歸正題,大家通過上面的例子知道了這個onConfigurationChanged要在Activity中重寫,配置跟上面一致,參數(shù)改變了而已 <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之前的系統(tǒng)只需要設(shè)置locale,4.2+就得多設(shè)置layoutDirection這個配置,不然onConfigurationChanged依舊不會被回調(diào)。
上面的在Activity重寫onConfigurationChanged方式明顯存在一個缺點,如果只需要改變某個Activity的語言設(shè)置,上面的方式可以適用,如果要改變整個應(yīng)用的語言設(shè)置,上面的方式就很low,要每個Activity都重寫onConfigurationChanged,雖然可以在Activity基類中重寫,但是,AndroidManifest中還是得每個Activity標(biāo)簽下都去設(shè)置 android:configChanges="locale|layoutDirection, 說了這么多就不繞彎子了,我們可以在Application中重寫onConfigurationChanged @Override public void onConfigurationChanged(Configuration newConfig) {Log.e("MyApplication","onConfigurationChanged"); super.onConfigurationChanged(newConfig); SystemUtil.initAppLanguage(getBaseContext()); } 這個配置是整個應(yīng)用設(shè)置的,在這里設(shè)置語言,能夠改變整個應(yīng)用的語言設(shè)置,而且這種方式,無需在AndroidManifest中增加配置,我測試過,在Application中重寫onConfigurationChanged,Activity的onConfigurationChanged
依舊能夠回調(diào)到,但是其中有沒有造成什么影響,我這里暫時沒有發(fā)現(xiàn)。如果有采用我提供的這種方式實現(xiàn)語言切換監(jiān)聽的,遇到問題可以告訴我,我們一起探討下。
好了,本文到此結(jié)束。
總結(jié)
- 上一篇: 关于优酷开放SDk之setOnVideo
- 下一篇: Andorid App内部跟随熊语言改变