欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android 系統(tǒng)語(yǔ)言切換監(jiān)聽(tīng)和設(shè)置實(shí)例代碼

 更新時(shí)間:2017年06月02日 09:30:27   作者:小楓_S  
本篇文章主要介紹了Android 系統(tǒng)語(yǔ)言切換監(jiān)聽(tīng)和設(shè)置實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

最近項(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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論