最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android多語(yǔ)言適配的示例代碼(兼容7.0+)

 更新時(shí)間:2018年03月10日 16:03:16   作者:BrightVan  
本篇文章主要介紹了Android多語(yǔ)言適配的示例代碼(兼容7.0+),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

一、前言

1、安卓系統(tǒng)本身對(duì)多語(yǔ)言適配就提供了一套框架和API。我們就直接用就可以了。

2、更換語(yǔ)言必須recreate Activity。目前,沒(méi)見(jiàn)過(guò)可以不重建的方法。常用App,也都是重建的,可以看的到。

3、兼容性問(wèn)題。現(xiàn)在越來(lái)越多設(shè)備都是安卓7.0+新手機(jī)的安卓版本會(huì)更高(安卓8.0+),所以適配是必要的。

4、目前,網(wǎng)上大部分相關(guān)文章都是不兼容7.0+的,具體做法一搜一大把。

二、具體做法

1、多語(yǔ)言文件

文件夾命名參考下面博客(網(wǎng)上有很多):

多國(guó)語(yǔ)言value文件夾命名

value默認(rèn)放英文的資源文件,簡(jiǎn)體中文文件夾命名為values-zh-rCN,不需要翻譯的設(shè)置translatable如下:

復(fù)制代碼 代碼如下:

<string name="app_name_english" translatable="false">You App English Name</string>

2、多語(yǔ)言工具類

public class LanguageUtils {
 public static final String CHINESE_SIMPLE = "zh_CN";
 public static final String ENGLISH = "en";
 public static final String AUTO = "auto";
 private static final String TAG = "LanguageUtils";
 //public static final String[] LOCALES = Utils.getContext().getResources().getStringArray(R.array.locales);

 private LanguageUtils() {
  throw new UnsupportedOperationException("u can't instantiate me...");
 }

 public static void setSystemDefaultLocale(Locale locale) {

 }

 public static boolean isSetValue(Context context) {
  Locale currentLocale = context.getResources().getConfiguration().locale;
  return currentLocale.equals(getSetLocale());
 }

 private static Locale getSetLocale() {
  String locale = SPUtils.getInstance(BaseConstants.SP.NAME_APP_SETTINGS).getString(BaseConstants.SP.KEY_LANGUAGE, LanguageUtils.AUTO);
  if (locale.equals(LanguageUtils.AUTO)) {
   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    return Resources.getSystem().getConfiguration().getLocales().get(0);//解決了獲取系統(tǒng)默認(rèn)錯(cuò)誤的問(wèn)題
   } else {
    return Locale.getDefault();
   }
  }
  String[] array = locale.split("_");
  String language = array[0];
  if (array.length > 1) {
   String country = array[1];
   return new Locale(language, country);
  }
  return new Locale(language);
 }

 public static int getSetIndex() {
  String languageSet = SPUtils.getInstance(BaseConstants.SP.NAME_APP_SETTINGS).getString(BaseConstants.SP.KEY_LANGUAGE, LanguageUtils.AUTO);
  int localeIndex = 0;
  switch (languageSet) {
   case LanguageUtils.AUTO:
    localeIndex = 0;
    break;
   case LanguageUtils.CHINESE_SIMPLE:
    localeIndex = 1;
    break;
   case LanguageUtils.ENGLISH:
    localeIndex = 2;
    break;
  }
  return localeIndex;
 }

 public static Context wrapContext(Context context) {
  Resources resources = context.getResources();
  Locale locale = LanguageUtils.getSetLocale();

  Configuration configuration = resources.getConfiguration();
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   configuration.setLocale(locale);
   LocaleList localeList = new LocaleList(locale);
   LocaleList.setDefault(localeList);
   configuration.setLocales(localeList);
  } else {
   configuration.setLocale(locale);
  }
  return context.createConfigurationContext(configuration);
 }

 public static void applyChange(Context context) {
  Resources res = context.getResources();
  DisplayMetrics dm = res.getDisplayMetrics();
  Configuration conf = res.getConfiguration();

  Locale locale = getSetLocale();
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   conf.setLocale(locale);
   LocaleList localeList = new LocaleList(locale);
   LocaleList.setDefault(localeList);
   conf.setLocales(localeList);
  } else {
   conf.setLocale(locale);
  }
  res.updateConfiguration(conf, dm);
 }
}

3、代碼分析&兼容7.0+

3.1、如何獲取系統(tǒng)的語(yǔ)言設(shè)置,也就是7.0+你選擇auto,可以正確切換。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    return Resources.getSystem().getConfiguration().getLocales().get(0);//解決了獲取系統(tǒng)默認(rèn)錯(cuò)誤的問(wèn)題
   } else {
    return Locale.getDefault();
   }

看到這篇文章的你,可能已經(jīng)看過(guò)網(wǎng)上很多其他相關(guān)的文章,應(yīng)該知道,7.0+系統(tǒng)有個(gè)很奇怪的地方:

如果你在app內(nèi)切換了語(yǔ)言(比如說(shuō)是英文),且該語(yǔ)言和系統(tǒng)的設(shè)置(比如說(shuō)是中文)不同,那么你再次切換語(yǔ)言并選擇auto時(shí),通過(guò)Locale.getDefault()獲取會(huì)錯(cuò)誤,或者你通過(guò)LocaleList.get(0)也是錯(cuò)誤的,你之前選擇的語(yǔ)言(英文)排序被提前了。有些文章的解決方案是在app打開(kāi)時(shí)持久化系統(tǒng)設(shè)置,這樣你切換app的語(yǔ)言就不會(huì)影響你獲取系統(tǒng)的設(shè)置,但這樣沒(méi)必要,太麻煩(應(yīng)該是不知道上面的方法)。

7.0+的系統(tǒng)設(shè)置也看的出差別,以前,設(shè)置系統(tǒng)語(yǔ)言直接選擇就可以了,現(xiàn)在你要先添加,然后再排序,排在第一個(gè)的才是系統(tǒng)顯示的語(yǔ)言!

3.2、寫(xiě)個(gè)BaseActivity作為所有Activity父類

新建一個(gè)BaseActivity用于繼承,重寫(xiě):

@Override
 protected void attachBaseContext(Context newBase) {
  super.attachBaseContext(LanguageUtils.wrapContext(newBase));
 }

然后在切換語(yǔ)言后,你要recreate Activity。這個(gè)在哪調(diào)用就看具體需求了。你可以像微信那樣,清空棧,然后直接重啟到主界面,也可以在設(shè)置界面recreate,但棧內(nèi)其他Activity,也要想辦法通知recreate。

3.3、屏蔽系統(tǒng)設(shè)置改變

如果app的語(yǔ)言選項(xiàng)不是auto,那么系統(tǒng)語(yǔ)言設(shè)置修改時(shí),app就不應(yīng)該跟著系統(tǒng)變,而是按照自己設(shè)置的語(yǔ)言顯示。寫(xiě)一個(gè)類繼承于Application(注意要在manifest配置哦,不然無(wú)效的)

public class MyApp extends Application {
 private Configuration deltaConfig;

@Override
 public void onConfigurationChanged(Configuration newConfig) {
  LogUtils.d(TAG, "調(diào)用了onConfigurationChanged");
  int diff = newConfig.diff(deltaConfig);
  String languageSet = SPUtils.getInstance(AppConstants.SP.NAME_APP_SETTINGS).getString(AppConstants.SP.KEY_LANGUAGE, LanguageUtils.AUTO);
  if (languageSet.equals(LanguageUtils.AUTO)) {//看app語(yǔ)言設(shè)置是不是auto,是的話不管,直接super
   super.onConfigurationChanged(newConfig);
   deltaConfig = newConfig;
  } else if (diff != ActivityInfo.CONFIG_LOCALE) {//這個(gè)Configuration更改是不是語(yǔ)言,不是的話,也不管
   super.onConfigurationChanged(newConfig);
   deltaConfig = newConfig;
  }
   //這里使系統(tǒng)設(shè)置語(yǔ)言無(wú)效
   //相當(dāng)于省略了
   //else{
   // return;
   //}
 }

 @Override
 public void onCreate() {
  super.onCreate();
  //app打開(kāi)時(shí)記錄系統(tǒng)設(shè)置
  deltaConfig = getApplicationContext().getResources().getConfiguration();
  LanguageUtils.applyChange(getApplicationContext());
  }
 }
}

3.4、其他問(wèn)題

Application的Context也要更新

LanguageUtils.applyChange(context);
LanguageUtils.applyChange(context.getApplicationContext());

但即使這樣,還是有點(diǎn)問(wèn)題,主要在于:

如果Activity的Title你是在manifest中定義的,如下label:

<activity
   android:name=".ui.activity.AboutActivity"
   android:launchMode="singleTop"
   android:label="@string/lable_activity_about"
   android:theme="@style/AppTheme.NoActionBar"/>

那么,即使你更新了ApplicationContext,有些Activity也有可能不生效,而且每次都還不一樣,這個(gè)沒(méi)法復(fù)現(xiàn)(很迷)。不知道是不是系統(tǒng)bug(測(cè)試系統(tǒng)是一加3 氫OS 8.0),或者是有其他更好的寫(xiě)法?

針對(duì)這個(gè)問(wèn)題,只要在activity oncreate() 里setTitle()就好了。這樣是不會(huì)有什么問(wèn)題的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Flutter自定義圓盤(pán)取色器

    Flutter自定義圓盤(pán)取色器

    這篇文章主要為大家詳細(xì)介紹了Flutter自定義圓盤(pán)取色器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Android RIL使用詳解

    Android RIL使用詳解

    這篇文章主要介紹了Android RIL使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Android開(kāi)發(fā)EditText禁止輸入監(jiān)聽(tīng)及InputFilter字符過(guò)濾

    Android開(kāi)發(fā)EditText禁止輸入監(jiān)聽(tīng)及InputFilter字符過(guò)濾

    這篇文章主要為大家介紹了Android開(kāi)發(fā)EditText禁止輸入監(jiān)聽(tīng)及InputFilter字符過(guò)濾示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • android自定義view實(shí)現(xiàn)數(shù)字進(jìn)度條

    android自定義view實(shí)現(xiàn)數(shù)字進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了android自定義view實(shí)現(xiàn)數(shù)字進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 詳解用RxJava實(shí)現(xiàn)事件總線(Event Bus)

    詳解用RxJava實(shí)現(xiàn)事件總線(Event Bus)

    本篇文章主要介紹了用RxJava實(shí)現(xiàn)事件總線(Event Bus),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Android實(shí)現(xiàn)拍照或者選取本地圖片

    Android實(shí)現(xiàn)拍照或者選取本地圖片

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)拍照或者選取本地圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android實(shí)現(xiàn)自動(dòng)匹配關(guān)鍵字并且標(biāo)紅功能

    Android實(shí)現(xiàn)自動(dòng)匹配關(guān)鍵字并且標(biāo)紅功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自動(dòng)匹配關(guān)鍵字并且標(biāo)紅功能,單關(guān)鍵字和多關(guān)鍵字進(jìn)行匹配,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Kotlin如何直接使用控件ID原理詳析

    Kotlin如何直接使用控件ID原理詳析

    這篇文章主要給大家介紹了關(guān)于Kotlin如何直接使用控件ID原理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Android重寫(xiě)View并自定義屬性實(shí)例分析

    Android重寫(xiě)View并自定義屬性實(shí)例分析

    這篇文章主要介紹了Android重寫(xiě)View并自定義屬性的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android基于重寫(xiě)View實(shí)現(xiàn)自定義屬性的相關(guān)布局與具體技巧,需要的朋友可以參考下
    2016-02-02
  • Android使用文件進(jìn)行IPC

    Android使用文件進(jìn)行IPC

    這篇文章主要為大家詳細(xì)介紹了Android使用文件進(jìn)行IPC,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評(píng)論

贞丰县| 太谷县| 准格尔旗| 菏泽市| 建瓯市| 宁城县| 宜黄县| 奈曼旗| 沽源县| 大连市| 柘荣县| 芜湖市| 翁牛特旗| 上栗县| 康平县| 抚宁县| 平安县| 德安县| 呼玛县| 中山市| 资源县| 交口县| 噶尔县| 嘉鱼县| 高邑县| 濮阳市| 泽库县| 西青区| 温州市| 乌兰浩特市| 遵化市| 察雅县| 恩施市| 钟山县| 中阳县| 新绛县| 乌审旗| 巴林左旗| 会宁县| 洛南县| 马关县|