Android 系統(tǒng)語(yǔ)言切換監(jiān)聽(tīng)和設(shè)置實(shí)例代碼
最近項(xiàng)目上產(chǎn)品經(jīng)理提了個(gè)需求,要求關(guān)閉語(yǔ)言國(guó)際化,不管手機(jī)系統(tǒng)設(shè)置那個(gè)國(guó)家的語(yǔ)言,都要顯示漢語(yǔ),好吧,既然有需求,那就做吧。但是項(xiàng)目中已經(jīng)有英文的配置了,且是作為默認(rèn)String提供的,這么多翻譯好的文字,直接刪除掉替換成中文為默認(rèn)String又感覺(jué)棄之可惜。故網(wǎng)上Google下解決方案。就開(kāi)始往下看吧。
一、代碼中動(dòng)態(tài)設(shè)置應(yīng)用顯示語(yǔ)言(手動(dòng)控制使用values-zh-rCN下字符串)
這個(gè)方法是通過(guò)改變Resource中的配置來(lái)實(shí)現(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ǔ)言文字的。因?yàn)槲覀兊膽?yīng)用在運(yùn)行階段中,系統(tǒng)語(yǔ)言發(fā)生了改變后,我們的應(yīng)用還是會(huì)被切換語(yǔ)言的,如果沒(méi)有指定語(yǔ)言,就顯示默認(rèn)的語(yǔ)言。這肯定不是我們要看到的結(jié)果,那就到了標(biāo)題中提到的語(yǔ)言切換監(jiān)聽(tīng)了。
二、語(yǔ)言切換監(jiān)聽(tīng)
1.廣播方式監(jiān)聽(tīng)
我們可以通過(guò)監(jiān)聽(tīng)系統(tǒng)廣播來(lái)實(shí)現(xiàn)(廣播靜態(tài)注冊(cè)動(dòng)態(tài)注冊(cè)都可以,動(dòng)態(tài)注冊(cè)把握好注冊(cè)時(shí)機(jī))
/** * ClassName: LocaleChangeReceiver * Description:(這里用一句話描述這個(gè)類的作用) * 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); } } }
這里我們通過(guò)監(jiān)聽(tīng)I(yíng)ntent.ACTION_LOCALE_CHANGED廣播,在系統(tǒng)語(yǔ)言切換后我們會(huì)得到通知,然后就愛(ài)干嘛干嘛了,這里我通過(guò)調(diào)用上面 提到的設(shè)置語(yǔ)言方法,將語(yǔ)言設(shè)置為初始設(shè)定語(yǔ)言。網(wǎng)上大多都是采用這種方式來(lái)監(jiān)聽(tīng)語(yǔ)言切換,其實(shí)還有另外一種方式。
2.重寫(xiě)onConfigurationChanged方法
一些系統(tǒng)設(shè)置變化后都會(huì)回調(diào)這個(gè)方法,所以我們可以從這里下手。
那在哪里重寫(xiě)這個(gè)方法呢,這個(gè)方法大家是不是感覺(jué)很熟悉,監(jiān)聽(tīng)橫豎屏切換是不是有用到過(guò)呢,提到橫豎屏切換,這里順便講點(diǎn)題外話
在橫豎屏切換的時(shí)候,我們?yōu)榱吮苊釧ctivity重新調(diào)用onCreate,一般都會(huì)重寫(xiě)這個(gè)方法,但是,橫豎屏切換后Activity沒(méi)有調(diào)用onConfigurationChanged而是依舊調(diào)用了onCreate,因?yàn)槲覀傾ctivity默認(rèn)是不回調(diào)onConfigurationChanged的,開(kāi)啟方法就是
<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是橫豎屏切換的配置,至于為什么要同時(shí)加上screenSize,是因?yàn)锳ndroid3.0之后,如果只設(shè)置orientation沒(méi)有設(shè)置screenSize,onConfigurationChanged依舊不會(huì)被回調(diào)。
那回歸正題,大家通過(guò)上面的例子知道了這個(gè)onConfigurationChanged要在Activity中重寫(xiě),配置跟上面一致,參數(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 這里同樣存在一個(gè)問(wèn)題,4.2之前的系統(tǒng)只需要設(shè)置locale,4.2+就得多設(shè)置layoutDirection這個(gè)配置,不然onConfigurationChanged依舊不會(huì)被回調(diào)。
上面的在Activity重寫(xiě)onConfigurationChanged方式明顯存在一個(gè)缺點(diǎn),如果只需要改變某個(gè)Activity的語(yǔ)言設(shè)置,上面的方式可以適用,如果要改變整個(gè)應(yīng)用的語(yǔ)言設(shè)置,上面的方式就很low,要每個(gè)Activity都重寫(xiě)onConfigurationChanged,雖然可以在Activity基類中重寫(xiě),但是,AndroidManifest中還是得每個(gè)Activity標(biāo)簽下都去設(shè)置
android:configChanges="locale|layoutDirection,說(shuō)了這么多就不繞彎子了,我們可以在Application中重寫(xiě)onConfigurationChanged
@Override public void onConfigurationChanged(Configuration newConfig) { Log.e("MyApplication","onConfigurationChanged"); super.onConfigurationChanged(newConfig); SystemUtil.initAppLanguage(getBaseContext()); }
這個(gè)配置是整個(gè)應(yīng)用設(shè)置的,在這里設(shè)置語(yǔ)言,能夠改變整個(gè)應(yīng)用的語(yǔ)言設(shè)置,而且這種方式,無(wú)需在AndroidManifest中增加配置,我測(cè)試過(guò),在Application中重寫(xiě)onConfigurationChanged,Activity的onConfigurationChanged
依舊能夠回調(diào)到,但是其中有沒(méi)有造成什么影響,我這里暫時(shí)沒(méi)有發(fā)現(xiàn)。如果有采用我提供的這種方式實(shí)現(xiàn)語(yǔ)言切換監(jiān)聽(tīng)的,遇到問(wèn)題可以告訴我,我們一起探討下。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)app應(yīng)用多語(yǔ)言切換功能
- Android app應(yīng)用多語(yǔ)言切換功能實(shí)現(xiàn)
- android動(dòng)態(tài)設(shè)置app當(dāng)前運(yùn)行語(yǔ)言的方法
- 詳解Android更改APP語(yǔ)言模式的實(shí)現(xiàn)過(guò)程
- android 使用kotlin 實(shí)現(xiàn)點(diǎn)擊更換全局語(yǔ)言(中日英切換)
- Android 7.0以上版本實(shí)現(xiàn)應(yīng)用內(nèi)語(yǔ)言切換的方法
- Android實(shí)現(xiàn)應(yīng)用內(nèi)置語(yǔ)言切換功能
- Android實(shí)現(xiàn)系統(tǒng)語(yǔ)言切換功能
- Android App中進(jìn)行語(yǔ)言的切換
相關(guān)文章
Android點(diǎn)擊WebView實(shí)現(xiàn)圖片縮放及滑動(dòng)瀏覽效果
這篇文章主要為大家詳細(xì)介紹了Android點(diǎn)擊WebView實(shí)現(xiàn)圖片縮放及滑動(dòng)瀏覽效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Android 通過(guò)Base64上傳圖片到服務(wù)器實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了Android 通過(guò)Base64上傳圖片到服務(wù)器實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05android GridView多選效果的實(shí)例代碼
在使用 GridView的時(shí)候,有時(shí)需要多選上面顯示的類容,比如批量刪除上面顯示的圖片,批量上傳圖片等。這個(gè)時(shí)候我們可以使用層疊圖來(lái)實(shí)現(xiàn),效果如下:2013-06-06Android開(kāi)發(fā)手冊(cè)TextView控件及陰影效果實(shí)現(xiàn)
這篇文章主要為大家介紹了Android開(kāi)發(fā)手冊(cè)TextView控件及陰影效果的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06android實(shí)現(xiàn)長(zhǎng)圖加載效果
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)長(zhǎng)圖加載效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Android貝塞爾曲線實(shí)現(xiàn)填充不規(guī)則圖形并隨手指運(yùn)動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android貝塞爾曲線實(shí)現(xiàn)填充不規(guī)則圖形,并隨手指運(yùn)動(dòng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09