Проблема собственно следующая: я реализовал в своём приложении смену языков по нажатию на кнопки в Activity (всё работает корректно), но я решил пойти дальше и попробовать реализовать тоже самое только уже в RecyclerView и во Fragment.
И тут понеслись нюансы. Сам список с языками вывел во Fragment, добавил методы которые у меня были в Activity, IDE вроде ошибок не выдаёт, но при нажатии на элемент, язык не меняется почему-то. Возможно я что-то забыл.
Код моего Fragment'а:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_languages, container, false);
initViews(view);
initializeData();
initializeAdapter();
loadLocale();
return view;
}
protected void initViews(View view) {
recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
}
public void loadLocale() {
String langPref = "Language";
SharedPreferences prefs = this.getActivity().getSharedPreferences("CommonPrefs", Activity.MODE_PRIVATE);
String language = prefs.getString(langPref, "");
changeLang(language);
}
public void changeLang(String lang) {
if (lang.equalsIgnoreCase(""))
return;
myLocale = new Locale(lang);
saveLocale(lang);
Locale.setDefault(myLocale);
android.content.res.Configuration config = new android.content.res.Configuration();
config.locale = myLocale;
getActivity().getBaseContext().getResources().updateConfiguration(config,
getActivity().getBaseContext().getResources().getDisplayMetrics());
}
public void saveLocale(String lang) {
String langPref = "Language";
SharedPreferences prefs = this.getActivity().getSharedPreferences("CommonPrefs", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(langPref, lang);
editor.commit();
}
private void initializeData() {
languages = new ArrayList<>();
languages.add(new Languages(getString(R.string.english)));
languages.add(new Languages(getString(R.string.russian)));
languages.add(new Languages(getString(R.string.deutsch)));
languages.add(new Languages(getString(R.string.romana)));
}
private void initializeAdapter() {
LanguagesAdapter languagesAdapter = new LanguagesAdapter(languages, position -> {
String lang = "en";
switch (position) {
case 0:
lang = "en";
break;
case 1:
lang = "ru";
break;
case 2:
lang = "de";
break;
case 3:
lang = "ro";
break;
default:
break;
}
changeLang(lang);
});
recyclerView.setAdapter(languagesAdapter);
}
@Override
public void onConfigurationChanged(android.content.res.Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (myLocale != null) {
newConfig.locale = myLocale;
Locale.setDefault(myLocale);
getActivity().getBaseContext().getResources().updateConfiguration(newConfig,
getActivity().getBaseContext().getResources().getDisplayMetrics());
}
}
Код адаптера:
public class LanguagesAdapter extends RecyclerView.Adapter<LanguagesAdapter.LanguageViewHolder> {
List<Languages> languages;
OnRVItemClickListener listener;
public LanguagesAdapter(List<Languages> languages, OnRVItemClickListener listener) {
this.languages = languages;
this.listener = listener;
}
public static class LanguageViewHolder extends RecyclerView.ViewHolder {
TextView languageName;
LanguageViewHolder(View itemView) {
super(itemView);
languageName = (TextView) itemView.findViewById(R.id.languages);
}
}
public interface OnRVItemClickListener {
void onRVItemClick(int position);
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
@Override
public LanguageViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.languages_list_item, viewGroup, false);
LanguageViewHolder lvh = new LanguageViewHolder(v);
return lvh;
}
@Override
public void onBindViewHolder(LanguageViewHolder personViewHolder, final int position) {
personViewHolder.languageName.setText(languages.get(position).name);
}
@Override
public int getItemCount() {
return languages.size();
}
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости