2016-11-23 68 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(); 
} 

這似乎已經解決了充分的問題