Воссоздать фактический фрагмент при выборе MenuItem - PullRequest
0 голосов
/ 04 июля 2018

Я хочу воссоздать (перезагрузить) фрагмент, когда я нажимаю на OptionsItem из действия навигации по ящику

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

        switch (id) {
            case R.id.fr:
                LocaleHelper.setLocale(getBaseContext(), "Fr");
                if(getVisibleFragment().isAdded()){
                    getVisibleFragment().getActivity().recreate();
                }
                return true;
            case R.id.ar:
                LocaleHelper.setLocale(getBaseContext(), "Ar");
                if(getVisibleFragment().isAdded()){
                    getVisibleFragment().getActivity().recreate();
                }
                return true;
            case R.id.en:
                LocaleHelper.setLocale(getBaseContext(), "En");
                if(getVisibleFragment().isAdded()){
                    getVisibleFragment().getActivity().recreate();
                }
                return true;
            case R.id.es:
                LocaleHelper.setLocale(getBaseContext(), "Es");
                if(getVisibleFragment().isAdded()){
                    getVisibleFragment().getActivity().recreate();
                }
                return true;
        }

    return super.onOptionsItemSelected(item);
}

когда я нажимаю на Option, я получаю эту ошибку:

java.lang.IllegalStateException: Fragment NewsMainFragment{9a39a2f} not attached to a context

как мне этого добиться?

1 Ответ

0 голосов
/ 04 июля 2018

В этом коде:

getVisibleFragment().getActivity().recreate();

вы воссоздаете все activity, а не fragment. Итак, если fragment, который вы хотите восстановить, находится в activity, где размещен метод onOptionsItemSelected(MenuItem item), вы просто воссоздаете текущую активность, поэтому вы можете вызвать просто:

recreate();

вместо вашего кода.

Но если вы хотите просто воссоздать fragment без воссоздания целого activity, вы можете поместить код, где вы инициализируете все представления вашего fragment, в отдельный публичный метод и вызвать их, например:

@Override
    public void onResume() {
        super.onResume();
        updateUi();
    }

    public void updateUi() {
        // Your code
    }

, а затем:

case R.id.fr:
                LocaleHelper.setLocale(getBaseContext(), "Fr");
                if(getVisibleFragment().isAdded()){
                    ((YourFragment)getVisibleFragment()).updateUi();
                }
                return true;
...