【问题标题】:Resuming a previous fragment onBackPressed()?恢复上一个片段 onBackPressed()?
【发布时间】:2014-06-30 10:12:48
【问题描述】:

我有一个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)。相反,它会尝试返回上一个 Activity,但由于没有(即之前的 Activity 调用了 finish()),它只会转到 Android 主屏幕。

我做错了什么?

PS:如果我不清楚,请在下面发表评论,我会尽力澄清。

【问题讨论】:

    标签: java android android-fragments android-fragmentactivity


    【解决方案1】:

    改变

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

    【讨论】:

    • 如果使用 addToBackStack,则不需要 OnBackPressed
    • @KlassenK 如果他不这样做super.onBackPressed();会直接退出Activity
    • 尝试像我在答案中链接的那样将“addToBackStack(null)”添加到您的事务中并完全删除 onBackPressed。
    【解决方案2】:

    使用addToBackStack(null) like.. 将您的片段添加到后台堆栈。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你可以使用:

        fragmentTransaction.addToBackStack(null);
        

        而且不需要照顾onBackPressed()

        顺便说一句,在您的onBackPressed() super.onBackPressed() 中意味着您实际上什么也没改变。

        应该是这样的:

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

        【讨论】:

        • 哦,好吧。等等,我怎么不用管onBackPressed?如果我按下返回按钮而无需我实现它,它会自动弹出堆栈吗?
        • 是的,由fragmentTransaction.addToBackStack(null);负责
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        相关资源
        最近更新 更多