Проблема собственно следующая: я реализовал в своём приложении смену языков по нажатию на кнопки в 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();
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Кто расскажет подробно, что делает данная опция ? Что означает атомарное перемещение ? Я никак не могу найти её объяснения
Как лучше разметить данную структуру по бэм? Все оставить как есть или лучше разбить по блокам вложенные элементы
Ставлю toggle на список li он весь исчезает! В интернете прочитал, что эту функцию убрали