上下文-警报对话框

时间:2020-04-27 08:22:33

标签: android android-context setlocale

我的目标是更改应用程序的语言。

我可以通过对我的应用程序类以及BaseActivity进行“ attachBaseContext”来实现此目的,并将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;
  }
}

我可以通过在我的Fragment SetNewLocale(context,“ fr-french”);中使用来更改UI中应用程序的语言。

虽然我想向用户显示对话框!使用ShowDialog.class(请参阅下文)。 上下文没有变化,它仍然为我提供了默认语言为“英语”的字符串,而我没有更改语言环境。但是,如果我手动重新启动应用程序,则字符串会更改!

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);

我一直在尝试了解为什么上下文没有刷新!请帮助我找到解决方案!

0 个答案:

没有答案