2022-06-27 Blankj-AndroidUtilCod

2022-06-27  本文已影响0人  兣甅

1.当APP第一次打开时,如果默认语言和手机语言不一致,则需要先在Application的onCreate中调用使用语言

  @Override
  public void onCreate() {
      super.onCreate();
      ...
      //设置APP语言
      if (LanguageUtils.getAppliedLanguage() == null) {//如果一次都没有设置,则需要默认设置一次,以便Activity中生效
        //这里面的主要作用是保障UtilsActivityLifecycleImpl的LanguageUtils方法生效
        //LanguageUtils.applyLanguage(locale);
        //由于上面这个方法会造成闪屏,所以将内部方法提取为下面的写法
        SPUtils.getInstance("Utils").put("KEY_LOCALE", locale.getLanguage() + "$" + locale.getCountry(), true);
      }
      ...
}

2.调用LanguageUtils.updateAppContextLanguage更新Application的语言

  @Override
  public void onCreate() {
      super.onCreate();
      ...
      //修改Application的语言
      LanguageUtils.updateAppContextLanguage(locale, null);
      ...
}

3.修复StringUtils获取string的语言

  @Override
  public void onCreate() {
      super.onCreate();
      ...
      //修复StringUtils获取string的语言
      LanguageUtil.applyLanguage(this, this.getResources(), locale);
      ...

4.由于LanguageUtils中的语言更新并没有更新到Resources.getSystem()中的语言,所以以防万一,我们再更新一下Resources.getSystem()中的语言,代码可以参考LanguageUtils中的更新方法

  @Override
  public void onCreate() {
    super.onCreate();
    ...
    if (ProcessUtils.isMainProcess()) {
      //修复WebView导致的语言切换失效,要放到设置语言前
      new WebView(this).destroy();
      //当前语言
      Locale locale = LanguageUtil.getCurrentLanguageLocale();
      //设置APP语言
      if (LanguageUtils.getAppliedLanguage() == null) {//如果一次都没有设置,则需要默认设置一次,以便Activity中生效
        //这里面的主要作用是保障UtilsActivityLifecycleImpl的LanguageUtils方法生效
        //LanguageUtils.applyLanguage(locale);
        //由于上面这个方法会造成闪屏,所以将内部方法提取为下面的写法
        SPUtils.getInstance("Utils").put("KEY_LOCALE", locale.getLanguage() + "$" + locale.getCountry(), true);
      }
      //修改Application的语言
      LanguageUtils.updateAppContextLanguage(locale, null);
      //修改Resources.getSystem()的语言
      LanguageUtil.applyLanguage(this, Resources.getSystem(), locale);
      //修复StringUtils获取string的语言
      LanguageUtil.applyLanguage(this, this.getResources(), locale);
      ...
    }
  }

部分调用方法:

  //获取当前语言
  public static Locale getCurrentLanguageLocale() {
    Locale locale = LanguageUtils.getAppliedLanguage();
    if (locale == null) {
      return Locale.US;
    } else {
      return locale;
    }
  }

  //设置当前语言
  public static void applyLanguage(Context context, Resources resources, Locale locale) {
    Configuration config = resources.getConfiguration();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
      LocaleList localeList = new LocaleList(locale);
      config.setLocales(localeList);
    } else {
      config.setLocale(locale);
    }
    context.createConfigurationContext(config);
  }
上一篇 下一篇

猜你喜欢

热点阅读