您需要执行一个 FragmentTransaction
并使用 replace()
方法。
这并不难做,但答案取决于您的菜单位于哪里(即,您的 onOptionsItemSelected()
回调是否在父 Activity 中,还是在 A/B Fragment 中?)。
为了简单起见,假设您的菜单实现和 onOptionsItemSelected()
在父 Activity 中,并且您想在选择 menu_option1 时重新设置片段。代码如下:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_option1:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new YourFragmentClass();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.your_fragment_id, newFragment);
transaction.addToBackStack(null);
transaction.commit();
return true;
case R.id.menu_option2:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
如果您的菜单是Fragment的子菜单(为了更方便地重用代码,应该这样设计),那么一种方法是要求托管Fragment的Activity实现由Fragment定义的接口,该接口可用作回调。在您的Fragment类中的onOptionsItemSelected()回调中,只需调用此回调方法即可。
虽然听起来很复杂,但实际上您只需要做几件事情。假设这是您的Fragment类。
public static class FragmentA extends ListFragment {
OnSelectedListener mListener;
public interface OnSelectedListener {
public void onSelected();
}
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnSelectedListener");
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_option1:
getActivity().onSelected();
return true;
case R.id.menu_option2:
return true;
default:
return super.onOptionsItemSelected(item);
}
}
...
}
然后在Activity中,你会看到类似下面的东西:
public class MainActivity extends Activity implements FragmentA.onSelectedListener{
...
public void onSelected(){
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Fragment newFragment = new YourFragmentClass();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.your_fragment_id, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
}