保留Android Fragments在后台堆栈中

4

我正在处理Android碎片,并且无法将碎片保留在后台堆栈中,也就是说,当我按下返回按钮时,它会将我推出启动片段的活动,我想在按下返回按钮时返回上一个片段。

到目前为止,我尝试过这个方法,但是我无法将碎片保存在后台堆栈中。

getActivity().getFragmentManager().beginTransaction()
             .replace(R.id.mainContainer, searchResultsFragment)
             .addToBackStack(null)
             .commit();

谢谢兄弟给我点踩,真的帮了我很大忙,完全不用建议什么 :/ - Muhammad Husnain Tahir
这不是我在投票,但他为什么这样做呢?因为在发布问题之前你必须先搜索,无论如何,你的问题很简单,我会回答它。 - Mina Fawzy
@MinaFawzy 我已经搜索了很多,但是我找不到任何东西,所以最终我不得不在这里问! - Muhammad Husnain Tahir
3个回答

6
在调用commit()提交事务之前,你应该像你提供的代码中一样将片段添加到后退栈addToBackStack(null)
然后重写onBackPressed()方法从栈中弹出片段。
你所面临的问题是,你使用FragmentManager进行了事务处理。
getActivity().getFragmentManager().beginTransaction()
             .replace(R.id.mainContainer, searchResultsFragment)
             .addToBackStack(null)
             .commit();

但是你在 onBackPressed() 里使用了 SupportFragmentManager

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

为了解决您的问题,您必须知道与您的片段类型相匹配的内容(在您的情况下为searchResultsFragment)。我是指它是否扩展自Fragment或Support Fragment。
如果您扩展了Fragment,请这样做。
import android.support.v4.app.Fragment;

在事务和返回操作中,都应该使用getSupportFragmentManager()

如果您正在使用片段,则需要这样做。

import android.app.Fragment;

在事务和返回按键中,你应该使用getFragmentManager()


谢谢你的帮助,我会尝试后在这里告诉你。 - Muhammad Husnain Tahir
我按照你的要求重写了onBackPressed方法,并参考其他答案提供的示例代码,但是"fragmentManager.getBackStackEntryCount()"总是返回"0"。 - Muhammad Husnain Tahir
尝试在提交之前或之后添加executePendingTransactions()。 - Mina Fawzy
让我们在聊天中继续这个讨论 - Muhammad Husnain Tahir

3

你需要在你的活动中重写onBackPressed方法。仅仅将片段添加到返回堆栈中是不够的。

@Override
public void onBackPressed() {
    FragmentManager fragmentManager = getSupportFragmentManager();
    if(fragmentManager.getBackStackEntryCount() != 0) {
        fragmentManager.popBackStack();
    } else {
        super.onBackPressed();
    }
}

谢谢您的回答,我会检查一下,然后在这里通知您。 - Muhammad Husnain Tahir
fragmentManager.getBackStackEntryCount() 总是返回“0”。 - Muhammad Husnain Tahir
with .addToBackstack(null) ? - Sebastian

0

我只是删掉了这一行代码:

.addToBackStack(null)

对我来说很有效。


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