您好,登錄后才能下訂單哦!
這篇文章給大家介紹Android應(yīng)用中怎么對系統(tǒng)語言進(jìn)行監(jiān)聽,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
一、代碼中動態(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)注冊把握好注冊時機(jī))
/** * 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
關(guān)于Android應(yīng)用中怎么對系統(tǒng)語言進(jìn)行監(jiān)聽就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。