Перенос функциональности из Activity во Fragment

450
19 марта 2017, 03:49

Проблема собственно следующая: я реализовал в своём приложении смену языков по нажатию на кнопки в 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();
    }
}
READ ALSO
Атомарное перемещение файла. StandartCopyOption.ATOMIC_MOVE

Атомарное перемещение файла. StandartCopyOption.ATOMIC_MOVE

Кто расскажет подробно, что делает данная опция ? Что означает атомарное перемещение ? Я никак не могу найти её объяснения

311
Как лучше разметить?

Как лучше разметить?

Как лучше разметить данную структуру по бэм? Все оставить как есть или лучше разбить по блокам вложенные элементы

264
Toggle в новой версии jquery нету? Подскажите что нибудь подобное toggle.

Toggle в новой версии jquery нету? Подскажите что нибудь подобное toggle.

Ставлю toggle на список li он весь исчезает! В интернете прочитал, что эту функцию убрали

311