【问题标题】:Strange beviour of replacing fragment in android在android中替换片段的奇怪行为
【发布时间】:2016-07-11 07:24:17
【问题描述】:

我无法理解 Fragment 替换的这种行为。在我的应用程序中,我从 FragmentA 移动到 FragmentB,然后是 FragmentC,然后是 FragmentX,从 FragmentX 我移动 FragmentD,我没有将 FragmentX 保留在后台堆栈中,但是当我弹出片段时,FragmentX 也被调用,因为调用了其他片段(用于测试目的我已经在每个片段的 onCreate() 方法中设置了日志)。我已经读过,当一个弹出片段 onCreate() 被调用时。我正在使用下面的代码来替换片段。

public void replaceFragment(BaseFragment fragment,boolean isToAddBackStack){
baseFragment = fragment;
FragmentTransaction fragmentTransaction = fm.beginTransaction();

fragmentTransaction.replace(R.id.fragment_controller, fragment,        fragment.getName());
if(isToAddBackStack)
    fragmentTransaction.addToBackStack(fragment.getName());
else
    fragmentTransaction.addToBackStack(null);

fragmentTransaction.commit();
}

我使用下面的代码来排便片段,因为我不希望用户向后导航,这就是为什么我在 FragmentManager 的列表中没有找到 FragmentX,但 FragmentX 仍然被排便。下面是我的代码用于排出碎片

public void clearBackStack(){
    for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
       fm.popBackStack();
    }
}

我的问题是为什么 FragmentX 在弹出片段时被调用,而我没有将其保留在后台堆栈中,是否还有其他弹出片段的方式(当我说弹出时,我的意思是清除回堆栈)。

注意:当我如前所述清除回栈时,我没有将 FragmentX 保留在回栈中 FragmentX 的 onCreate() 被调用,然后我的 UI 被挂起。我无法找到原因。有什么帮助吗?

【问题讨论】:

    标签: android fragment


    【解决方案1】:

    您的问题在于您的这部分代码 -

    if(isToAddBackStack)
        fragmentTransaction.addToBackStack(fragment.getName());
    else
        fragmentTransaction.addToBackStack(null);
    

    调用fragmentTransaction.addToBackStack(null)并不意味着该事务不会被添加到后台堆栈。这意味着将添加事务,但没有名称。

    从您的代码中删除 else 语句,它应该可以工作。

    ...
    if(isToAddBackStack)
        fragmentTransaction.addToBackStack(fragment.getName());
    // no else here
    ...
    

    【讨论】:

    • 这里要提到的一件事我已经尝试过,正如你提到的,但我发现了同样的行为。
    • @AbdulWaheed 为什么不尝试使用上面的代码,而不是自己弹出返回堆栈,而是让片段管理器处理它,即当按下返回按钮时,片段管理器会自动弹出返回堆栈上的最新条目。
    • 因为我想在用户在片段 a 和 b 上时限制流量,用户可以返回,但是当用户在片段 c 上时,我不希望用户转到上一个片段,这就是我拉屎的原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多