当我从“抽屉导航”活动中单击“ 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
我该如何正确实现?
答案 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;