Моя цель - изменить язык приложения.
Я могу добиться этого с помощью "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 ' мы пытались понять, почему контекст не обновляется! Пожалуйста, помогите мне найти решение этой проблемы!