Невозможно добавить поддержку мультиязычности в приложении для Android, имеющем viewpager на целевой странице
На целевой странице моих приложений есть пейджер с 3 фрагментами. На последней странице, то есть на странице с индексом 2, я добавил кнопку для изменения языка приложений. При нажатии на кнопку отображается бланк с двумя языками хинди и английским. После выбора одного из языков я использовал приведенный ниже код для сохранения и установки языка приложений.
public void showChangeLangDialog() {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getContext());
LayoutInflater inflater = this.getLayoutInflater();
final View dialogView = inflater.inflate(R.layout.language_dialog, null);
dialogBuilder.setView(dialogView);
final Spinner spinner1 = (Spinner) dialogView.findViewById(R.id.spinner_lang);
dialogBuilder.setTitle(getResources().getString(R.string.lang_dialog_title));
dialogBuilder.setMessage(getResources().getString(R.string.lang_dialog_message));
dialogBuilder.setPositiveButton(R.string.change, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
int langpos = spinner1.getSelectedItemPosition();
switch(langpos) {
case 0: //English
PreferenceManager.getDefaultSharedPreferences(getContext()).edit().putString("LANG", "en").apply();
setLangRecreate("en");
return;
case 1: //Hindi
PreferenceManager.getDefaultSharedPreferences(getContext()).edit().putString("LANG", "hi").apply();
setLangRecreate("hi");
return;
default: //By default set to english
PreferenceManager.getDefaultSharedPreferences(getContext()).edit().putString("LANG", "en").apply();
setLangRecreate("en");
return;
}
}
});
dialogBuilder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
//pass
}
});
AlertDialog b = dialogBuilder.create();
b.show();
}
public void setLangRecreate(String langval) {
Log.d("HelpFragment","selected language: "+langval);
Configuration config = getContext().getResources().getConfiguration();
locale = new Locale(langval);
Locale.setDefault(locale);
config.locale = locale;
getActivity().getBaseContext().getResources().updateConfiguration(config, getActivity().getBaseContext().getResources().getDisplayMetrics());
getActivity().recreate();
}
Я также добавил ниже код в onCreate в активности целевой страницы, чтобы восстановить языковые настройки.
private void setAppLanguage() {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
Configuration config = getBaseContext().getResources().getConfiguration();
String lang = settings.getString("LANG", "");
if (! "".equals(lang) && ! config.locale.getLanguage().equals(lang)) {
Locale locale = new Locale(lang);
Locale.setDefault(locale);
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
Log.d(TAG,"selected language: "+lang);
}
}
Проблема: Когда приложение запускает фрагмент, страница, проиндексированная на 0-й позиции, имеет язык, который мы предварительно установили. Если я перейду к какому-либо другому действию на этой странице, щелкнув по любому элементу пользовательского интерфейса, то при открытии не будет выбран язык, который мы выбрали. Кроме того, после запуска приложения, если я сразу перехожу на 3-ю страницу фрагмента окна просмотра, тогда и выбранный нами язык не устанавливается.
Вы можете понять из этого потока:
1st fragPage->3rd fragPage: lang не установлен
1st fragPage-> любая другая активность: lang не установлен
1-й фрагмент Page->2-й fragPage-> 3-й фрагмент Page: набор lang
fragPages - страницы viewPager в активности целевой страницы.