恢复上一个片段 onBackPressed()?

8

我有一个HomeFragment,其中有一个按钮,当点击该按钮时会调用以下内容:

Fragment frag = new CustFragment();
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.home_container, frag).commit();

然后在我的FragmentActivity中,也就是上面提到的片段中,我有:

@Override
public void onBackPressed() {

    getFragmentManager().popBackStack();
    super.onBackPressed();

}

这是我尝试过的方法,但如果我在“frag”片段上并按下返回按钮,它不会返回到上一个片段(即“HomeFragment”)。相反,它会尝试返回到上一个活动,但由于没有这样的活动(即先前的活动已调用“finish()”),它只会回到Android主屏幕。
我做错了什么?
PS:如果我表述不清,请在下面评论,我会尽力澄清。
4个回答

11

改变

@Override
public void onBackPressed() 
{
   getFragmentManager().popBackStack();
   super.onBackPressed();
}

@Override
public void onBackPressed() 
{
  if(getSupportFragmentManager().getBackStackEntryCount() > 0)
    getSupportFragmentManager().popBackStack();
  else
   super.onBackPressed();
}

fragmentManager.beginTransaction().replace(R.id.home_container, frag).commit();

fragmentManager.beginTransaction().replace(R.id.home_container, frag).addToBackStack(null).commit();

1
如果使用addToBackStack,就不需要OnBackPressed。 - Kuno
1
如果他不执行 super.onBackPressed();,那么将直接退出该 Activity - Apoorv
尝试在您的事务中添加"addToBackStack(null)",就像我在我的答案中链接的那样,并完全删除onBackPressed。 - Kuno

3
使用addToBackStack(null)将您的片段添加到后退堆栈中,如下所示...
fragmentManager.beginTransaction().replace(R.id.home_container, frag).addToBackStack(null).commit();

1

您可以使用:

fragmentTransaction.addToBackStack(null);

不需要关心 onBackPressed()

顺便提一下,在您的 onBackPressed() 中,super.onBackPressed() 意味着您实际上没有更改任何内容。

应该是这样的:

if(currentFragmentIsCustFragment){
   getSupportFragmentManager().popBackStack();
}else{
   super.onBackPressed();
}

哦,好的。等等,为什么我不需要处理 onBackPressed?如果我按下返回按钮而没有实现它,它会自动弹出堆栈吗? - u3l
是的,这个可以通过 fragmentTransaction.addToBackStack(null); 处理。 - Archie.bpgc

1

beginTransaction创建一个新的FragmentTransaction。它有一个方法addToBackstack。如果在提交事务之前调用它,您可以完全移除覆盖的onBackPressed。参考


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接