溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android應(yīng)用中怎么對系統(tǒng)語言進(jìn)行監(jiān)聽

發(fā)布時間:2020-12-07 15:59:55 來源:億速云 閱讀:438 作者:Leah 欄目:移動開發(fā)

這篇文章給大家介紹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é)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(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)容。

AI