选择MenuItem时重新创建实际片段

时间:2018-07-04 12:57:42

标签: android android-fragments android-activity navigation-drawer

当我从“抽屉导航”活动中单击“ 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);
}

当我单击选项时,出现此错误:

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

我该如何正确实现?

1 个答案:

答案 0 :(得分:0)

在此代码中:

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

您重新创建整个activity,而不是fragment。因此,如果要重新创建的fragment位于方法activity所在的onOptionsItemSelected(MenuItem item)中,则只需重新创建当前活动,即可调用:

recreate();

代替您的代码。

但是,如果您只想重新创建fragment而又不重新创建整个activity,则可以将代码(用于初始化fragment的所有视图)放在单独的public方法中并调用他们,例如:

@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;