Контекст - Оповещение Диалоги - PullRequest
0 голосов
/ 27 апреля 2020

Моя цель - изменить язык приложения.

Я могу добиться этого с помощью "attachBaseContext" для моего класса приложения, а также для моей BaseActivity и расширения моей BaseActivity для всех других моих классов Activity. ,

Класс приложения

public class Startup extends Application{

     @Override
            protected void attachBaseContext(Context base) {
                super.attachBaseContext(LocaleManager.setLocale(base));


            }
      @Override
        public void onConfigurationChanged(android.content.res.Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            LocaleManager.setLocale(this);
        }
}

Класс BaseActivity

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    protected void attachBaseContext(Context base){
       super.attachBaseContext(LocaleManager.setLocale(base));
    }

Класс LocaleManager

public class LocaleManager {
public static Context setLocale(Context mContext) {
    return updateResources(mContext, getLanguagePref(mContext));
  }

  /**
   * Set new Locale with context
   */
  public static Context setNewLocale(Context mContext, @LocaleDef String language) {
    setLanguagePref(mContext, language);
    return updateResources(mContext, language);
  }
 public static String getLanguagePref(Context mContext) {
    SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
    return mPreferences.getString(LANGUAGE_KEY, ENGLISH);
  }

  /**
   * set pref key
   */
  private static void setLanguagePref(Context mContext, String localeKey) {
    SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
    mPreferences.edit().putString(LANGUAGE_KEY, localeKey).apply();
  }

  /**
   * update resource
   */
  private static Context updateResources(Context context, String language) {
    Locale locale = new Locale(language);
    Locale.setDefault(locale);
    Resources res = context.getResources();
    Configuration config = new Configuration(res.getConfiguration());
    if (Build.VERSION.SDK_INT >= 17) {
      config.setLocale(locale);
      context = context.createConfigurationContext(config);
    } else {
      config.locale = locale;
      res.updateConfiguration(config, res.getDisplayMetrics());
    }
    return context;
  }
}

Я могу изменить язык приложения в пользовательском интерфейсе, используя в своем фрагменте SetNewLocale (context, "fr-french");

Хотя, когда я хочу показать диалог пользователю! используя ShowDialog.class (см. ниже). Контекст не меняется, и он все еще предоставляет мне строки на языке по умолчанию, который называется «Engli sh», а не в «Locale», я его изменил. Но если я перезапущу приложение вручную, строки изменятся!

ShowDialog

 public void showDialog(String messageHeader, final String messageBody) { // R.string.x = Hello
        mBuilder = new AlertDialog.Builder(this);
        mBuilder.setMessage(messageBody)
                .setCancelable(false)
                .setTitle(messageHeader);
        mBuilder.setPositiveButton(mContext.getString(R.string.btnOfflineOK), new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {

            }
        });
        mAlertDialog = mBuilder.create();
        mAlertDialog.show();
    }

MainActivity.Class

showDialog(mContext.getString(R.string.Hello),mContext.getstring(R.string.NotAvailable);

I ' мы пытались понять, почему контекст не обновляется! Пожалуйста, помогите мне найти решение этой проблемы!

...