Android 按back不会返回到上一个片段

Android 按back不会返回到上一个片段,android,android-fragments,back-stack,Android,Android Fragments,Back Stack,我在将片段事务添加到后堆栈时遇到问题。我有一个主要活动,其中我用菜单片段填充布局: public class MainActivity extends ActionBarActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); get

我在将片段事务添加到后堆栈时遇到问题。我有一个主要活动,其中我用菜单片段填充布局:

public class MainActivity extends ActionBarActivity{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getFragmentManager().beginTransaction().add(R.id.frag_container, new MainMenuFragment()).commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}

然后,在MainMenuFragment中,用户选择了一些选项,这些选项会将菜单片段替换为其他片段:

public class MainMenuFragment extends Fragment implements OnItemClickListener{
    GridView grid;
    FragmentManager manager;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.main_menu_fragment, container, false);

    manager = getActivity().getFragmentManager();
    grid = (GridView) root.findViewById(R.id.gridView1);

    grid.setAdapter(new MenuTileAdapter(getActivity()));
    grid.setOnItemClickListener(this);

    return root;
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    FragmentTransaction trans = manager.beginTransaction();
    if (position == 0){
        trans.replace(R.id.frag_container, new BasicSettingsFragment());
        trans.addToBackStack(null);
        trans.commit();
    }
}
public类MainMenuFragment扩展片段实现McClickListener{
网格视图网格;
碎片管理器;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图根=充气机。充气(R.layout.main\u菜单\u片段,容器,错误);
manager=getActivity().getFragmentManager();
grid=(GridView)root.findViewById(R.id.gridView1);
setAdapter(新的MenuTileAdapter(getActivity());
grid.setOnItemClickListener(this);
返回根;
}
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
FragmentTransaction=manager.beginTransaction();
如果(位置==0){
变速器更换(R.id.frag_容器,新的基本设置片段());
trans.addToBackStack(空);
trans.commit();
}
}
}


据我所知,这应该使得当用户按下设备上的“后退”按钮时,他们将返回到菜单片段,但这将退出应用程序。我做错了什么?

您的代码是一个混合体,您使用来自appcompat的ActionBarActivity,而不是使用getSupportFragmentManager(),如果您决定使用它,片段导入应该是appcompat导入。如果没有,请使用Activity而不是ActionBarActivity,并使用FragmentManager导入简单片段

将此添加到您的活动中android:configChanges=“keyboardHidden | orientation | screenSize” 这将阻止您在旋转时重新启动活动。
对片段使用
setRetainInstance(true)

使用
FragmentManager
添加或替换片段时,需要在调用
commit()

之前,使用
addToBackStack()
手动将旧片段添加到backstack,然后再调用
commit()

将主片段添加到backstack。您可以在活动中尝试此选项:

getFragmentManager().beginTransaction().add(
R.id.frag_container, new MainMenuFragment()).
addToBackStack(null).commit();

活动中覆盖:

@Override
public void onBackPressed() {
    if (getFragmentManager().getBackStackEntryCount() > 0) {
        getFragmentManager().popBackStack();
    } else {
        super.onBackPressed();
    }
}
您可能需要在每个提交的片段事务中使用:

FragmentTransaction.addToBackStack(null);

尝试添加而不是替换trans.add(R.id.frag_容器,new BasicSettings Fragment());另外,我只是注意到当旋转屏幕时,菜单片段根本没有被删除,只是被隐藏了。当我旋转手机时,它出现在
BasicSettingsFragment
上@GeorgianBenetatos添加只会将新片段放在前一个片段的上面。你应该发布完整的MainMenuFragment代码,一切看起来都很好。frag_容器是activity_main中的框架布局吗?@GeorgianBenetatos我刚刚用完整的代码更新了帖子。frga_容器实际上是在activity_main的XML文件中定义的框架布局。这就是我要做的。问题是,当我使用
replace
时,它不会删除旧的片段,因为当我旋转屏幕时,它会出现在旋转之前的页面上。你可能应该鼓励OP发布一个新问题。