国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 系統語言切換監聽和設置實例代碼

2019-10-23 18:27:23
字體:
來源:轉載
供稿:網友

最近項目上產品經理提了個需求,要求關閉語言國際化,不管手機系統設置那個國家的語言,都要顯示漢語,好吧,既然有需求,那就做吧。但是項目中已經有英文的配置了,且是作為默認String提供的,這么多翻譯好的文字,直接刪除掉替換成中文為默認String又感覺棄之可惜。故網上Google下解決方案。就開始往下看吧。

一、代碼中動態設置應用顯示語言(手動控制使用values-zh-rCN下字符串)

這個方法是通過改變Resource中的配置來實現的,代碼如下:

 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中設置也可以在Activity的基類中調用

但是上面的方法還是不足以讓我們的應用一直顯示指定的某種語言文字的。因為我們的應用在運行階段中,系統語言發生了改變后,我們的應用還是會被切換語言的,如果沒有指定語言,就顯示默認的語言。這肯定不是我們要看到的結果,那就到了標題中提到的語言切換監聽了。

二、語言切換監聽

1.廣播方式監聽

我們可以通過監聽系統廣播來實現(廣播靜態注冊動態注冊都可以,動態注冊把握好注冊時機)

/** * 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);    }  }}

這里我們通過監聽Intent.ACTION_LOCALE_CHANGED廣播,在系統語言切換后我們會得到通知,然后就愛干嘛干嘛了,這里我通過調用上面 提到的設置語言方法,將語言設置為初始設定語言。網上大多都是采用這種方式來監聽語言切換,其實還有另外一種方式。

2.重寫onConfigurationChanged方法

一些系統設置變化后都會回調這個方法,所以我們可以從這里下手。

那在哪里重寫這個方法呢,這個方法大家是不是感覺很熟悉,監聽橫豎屏切換是不是有用到過呢,提到橫豎屏切換,這里順便講點題外話

在橫豎屏切換的時候,我們為了避免Activity重新調用onCreate,一般都會重寫這個方法,但是,橫豎屏切換后Activity沒有調用onConfigurationChanged而是依舊調用了onCreate,因為我們Activity默認是不回調onConfigurationChanged的,開啟方法就是

 <activity  android/223850.html">android/125761.html">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標簽下添加android:configChanges="orientation|screenSize,orientation是橫豎屏切換的配置,至于為什么要同時加上screenSize,是因為Android3.0之后,如果只設置orientation沒有設置screenSize,onConfigurationChanged依舊不會被回調。

那回歸正題,大家通過上面的例子知道了這個onConfigurationChanged要在Activity中重寫,配置跟上面一致,參數改變了而已

<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之前的系統只需要設置locale,4.2+就得多設置layoutDirection這個配置,不然onConfigurationChanged依舊不會被回調。

上面的在Activity重寫onConfigurationChanged方式明顯存在一個缺點,如果只需要改變某個Activity的語言設置,上面的方式可以適用,如果要改變整個應用的語言設置,上面的方式就很low,要每個Activity都重寫onConfigurationChanged,雖然可以在Activity基類中重寫,但是,AndroidManifest中還是得每個Activity標簽下都去設置
android:configChanges="locale|layoutDirection,說了這么多就不繞彎子了,我們可以在Application中重寫onConfigurationChanged

@Overridepublic void onConfigurationChanged(Configuration newConfig) {  Log.e("MyApplication","onConfigurationChanged");  super.onConfigurationChanged(newConfig);  SystemUtil.initAppLanguage(getBaseContext());}

這個配置是整個應用設置的,在這里設置語言,能夠改變整個應用的語言設置,而且這種方式,無需在AndroidManifest中增加配置,我測試過,在Application中重寫onConfigurationChanged,Activity的onConfigurationChanged

依舊能夠回調到,但是其中有沒有造成什么影響,我這里暫時沒有發現。如果有采用我提供的這種方式實現語言切換監聽的,遇到問題可以告訴我,我們一起探討下。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大英县| 驻马店市| 宜宾县| 崇文区| 建始县| 丰原市| 顺平县| 灵寿县| 临夏市| 高邑县| 焦作市| 遂川县| 东丽区| 陆川县| 泾川县| 磴口县| 中山市| 斗六市| 夏河县| 江口县| 凌云县| 晋江市| 馆陶县| 武川县| 来凤县| 梅河口市| 玉屏| 迭部县| 申扎县| 大港区| 阳信县| 黄大仙区| 修武县| 万源市| 东港市| 出国| 策勒县| 沙田区| 敦煌市| 荣成市| 通榆县|