Я могу идеально изменить язык в своем приложении, и оно работает с любым действием. Никогда не было проблем (с моим S4 и телефонами моего друга). Но когда я делаю это со своим S9 (Oreo 8.0), ничего не работает. Язык меняется для некоторых вещей, но большая часть моего приложения не меняет язык. Я не понимаю, что изменилось с Oreo, что больше не работает с тем, что я сделал?
Вот что я делаю, чтобы изменить его (пример для испанского языка):
private View.OnClickListener btnLangue3Listener = new View.OnClickListener() {
@Override
public void onClick(View v) {
langue.setBackground(ResourcesCompat.getDrawable(getResources(), R.mipmap.spanishflag, null));
langueMenu.setVisibility(View.GONE);
if (Locale.getDefault().getLanguage().equals("fr") || Locale.getDefault().getLanguage().equals("en")) {
Context context = getApplicationContext();
changeLang(context ,"es");
saveLocale("es");
restartActivity();
}
}
};
private void restartActivity() {
Intent mStartActivity = new Intent(getApplicationContext(), SplashActivity.class);
finish();
CharSequence text = getApplicationContext().getResources().getString(R.string.messageLang);
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(this, text, duration);
toast.show();
int secs = 14; // Delay in seconds
Utils.delay(secs, new Utils.DelayCallback() {
@Override
public void afterDelay() {
Intent mStartActivity = new Intent(getApplicationContext(), SplashActivity.class);
int mPendingIntentId = 123456;
PendingIntent mPendingIntent = PendingIntent.getActivity(getApplicationContext(), mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
System.exit(0);
}
});
}
public void loadLocale() {
String langPref = "Language";
SharedPreferences prefs = getSharedPreferences("CommonPrefs",
Activity.MODE_PRIVATE);
String language = prefs.getString(langPref, "");
changeLang(getApplicationContext(), language);
}
public void changeLang(Context context, String lang) {
if (lang.equalsIgnoreCase(""))
return;
Locale locale = new Locale(lang);
Locale.setDefault(locale);
Configuration config = getApplicationContext().getResources().getConfiguration();
config.setLocale(locale);
getApplicationContext().createConfigurationContext(config);
getApplicationContext().getResources().updateConfiguration(config, getApplicationContext().getResources().getDisplayMetrics());
}
public void saveLocale(String lang) {
String langPref = "Language";
SharedPreferences prefs = getSharedPreferences("CommonPrefs",
Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(langPref, lang);
editor.commit();
}
Вкратце: я меняю локаль на «es», перезапускаю действие и приложение (не работало, если я не перезапускал приложение) и сохраняю его в файле sharedpreferences. Как только действие открывается, я получаю общие настройки и использую их в качестве локали следующим образом: Сначала я вызываю loadLocale(); тогда :
public void loadLocale() {
String langPref = "Language";
SharedPreferences prefs = getSharedPreferences("CommonPrefs",
Activity.MODE_PRIVATE);
String language = prefs.getString(langPref, "");
changeLang(language);
}
public void changeLang(String lang) {
if (lang.equalsIgnoreCase(""))
return;
Locale myLocale = new Locale(lang);
saveLocale(lang);
Locale.setDefault(myLocale);
Configuration config = getApplicationContext().getResources().getConfiguration();
config.setLocale(myLocale);
this.createConfigurationContext(config);
this.getResources().updateConfiguration(config, getApplicationContext().getResources().getDisplayMetrics());
}
public void saveLocale(String lang) {
String langPref = "Language";
SharedPreferences prefs = getSharedPreferences("CommonPrefs",
Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(langPref, lang);
editor.commit();
}
Что я делаю неправильно? Есть ли более простой или лучший способ сделать это? Я искал везде, и ничего не получалось...