2022-06-27 Blankj-AndroidUtilCode-LanguageUtils使用踩坑

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);
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容