2016-11-23 67 views
1

我有一个包含两个容器的活动,分别为fragment,container_left和container_right。多帧,加载多个片段,不能控制后台堆栈

在导航开始时,列表片段位于container_left中,加载到container_right的片段是一个包含多个按钮的屏幕。

当某人在container_right的片段中选择一个按钮时,该片段将替换container_left中的一个片段,并将新片段加载到container_right中。此时,我已将这笔交易保存到了后台。如果此时按下后退按钮,原始列表将加载到container_left中,并将按钮片段加载到container_right中。但是如果这个人选择了另一个按钮(现在在左边框中),它会向右边的容器添加一个不同的片段。我不想将新事务添加到backstack,因为我不想保存只有fragment_container_right更改的事务。我想要后退按钮只能改变片段的位置。

问题是,在后台堆栈中的事务正在寻找在右侧框架中删除的原始片段,并且由于该变化,它不会删除新的片段,因此按钮片段显示为ON container_right中的新片段。

我一直在搞这一段时间,但我无法弄清楚这一点。

我该如何设置它,以便当它弹出堆栈时,即使它们不是当提交事务时那里存在的碎片,当前在container_right中的任何碎片都会被删除?

这里是我到目前为止加载帧的样本。正如你所看到的,我在提交之前检查控制按钮是否在左边框架中,所以它不会在每次按下按钮时加载一个新实例,而且我对每个加载到container_right的片段都做同样的事情,如果有人点击已加载片段的按钮,则不会创建新片段。剩下的唯一问题就是后援交易。

if (!(controlsInLeftFrame)) { 
      getFragmentManager().beginTransaction(). 
        replace(R.id.fragment_container_right, fragAD). 
        replace(R.id.fragment_container_left, fragRECB).addToBackStack(null).commit(); 
     } else if (!(getFragmentManager().findFragmentById(R.id.fragment_container_right) instanceof FragAttributeDescription)){ 
      getFragmentManager().beginTransaction(). 
        replace(R.id.fragment_container_right, fragAD).commit(); 
     } 
    } 

    if (message.equals("Movement")) { 

     FragRaceEditorMovement fragRM = new FragRaceEditorMovement(); 
     fragRM.setArguments(bundle); 

     if (!(controlsInLeftFrame)) { 
      getFragmentManager().beginTransaction(). 
        replace(R.id.fragment_container_right, fragRM). 
        replace(R.id.fragment_container_left, fragRECB).addToBackStack(null).commit(); 
     } else if (!(getFragmentManager().findFragmentById(R.id.fragment_container_right) instanceof FragRaceEditorMovement)){ 
      getFragmentManager().beginTransaction(). 
        replace(R.id.fragment_container_right, fragRM).commit(); 
     } 

回答

0

好吧,我想通了。

覆盖onBackPressed()工作。我曾尝试过一次,但意识到我忘记了在删除右手边片段后放置super.onBackPressed()。

public void onBackPressed() { 
    getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.fragment_container_right)).commit(); 
    super.onBackPressed(); 
} 

这似乎已经解决了充分的问题