簡體   English   中英

如何用后堆棧中的另一個片段替換多個片段?

[英]How to replace more than one fragments with another one in the back stack?

我在后面的堆棧A,B,C中有以下片段。 然后我想添加片段D ,但是在后面的堆棧中我想要放置A和D而不是A,B,C,D 問題是當我嘗試使用transaction.remove()刪除B和C時, backStackEntryCount仍然是舊的,它會在按下時顯示空屏幕。 有辦法處理這個嗎?

當我使用popBackStack()它轉到片段A然后來到D,這會產生奇怪的動畫效果。

編輯:問題不是重復,因為它被標記,因為這個問題更多的是控制后堆棧中幾個片段的順序。

添加到Backstack時,您可以包含一個名稱,以便在您處於特定狀態時彈出Backstack。 基於FragmentManager#popBackStack(string,int)的文檔;

從管理器的片段后向堆棧中彈出最后一個片段轉換。 如果沒有要彈出的內容,則返回false。 此函數是異步的 - 它將請求排入pop,但在應用程序返回其事件循環之前不會執行該操作。

參數

name String :如果為非null,則為要查找的先前后退狀態的名稱; 如果找到,將彈出所有達到該狀態的狀態。 POP_BACK_STACK_INCLUSIVE標志可用於控制是否彈出命名狀態本身。 如果為null,則僅彈出頂部狀態。

flags int :0或POP_BACK_STACK_INCLUSIVE。

所以在這種情況下你:

將片段A添加到容器和根后台。 給它一個名字,這樣你就可以在彈出時引用它。

片段A

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, FragmentA, "FragmentA")
.addToBackStack("first")
.commit();

將片段B添加到容器中(替換或添加,無關緊要)。 如果您願意,可以使用“null”或其他名稱添加到Backstack。 它必須與“第一”不同。

片段B

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, FragmentB, "FragmentB")
.addToBackStack(null)
.commit();

像片段B一樣添加或替換片段C

片段C

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, FragmentC, "FragmentC")
.addToBackStack(null)
.commit();

像片段B和C一樣添加或替換片段D.

片段D

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, FragmentD, "FragmentD")
.addToBackStack(null)
.commit();

然后,在onBackPressed() ,首先檢查“FragmentD”是否在堆棧中。 如果是,則一直彈回到根(在這種情況下是“第一個”)。 如果沒有,只需像往常一樣處理背部按壓。

@Override
public void onBackPressed() {
    FragmentManager fm = getFragmentManager();
    if (fm.findFragmentByTag("FragmentD") != null) {
       fm.popBackStack("first", 0); // Pops everything up to "first" 
    } else {
       super.onBackPressed(); // Pops backstack like normal or leaves App if at base.
    }
}

這應該做的是讓你的用戶在他們按下片段A,B或C中的后退按鈕時“返回”。然后當他們最終進入片段D時,它將一直彈回到A.

片段A.

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, FragmentA, "FragmentA");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

片段B

fragmentTransaction.replace(R.id.fragment_container, FragmentB, "FragmentB");

片段C

 fragmentTransaction.replace(R.id.fragment_container, FragmentC, "FragmentC");

片段D.

 fragmentTransaction.replace(R.id.fragment_container, FragmentD, "FragmentD");

現在你的onBackPressed()在活動中

@Override
public void onBackPressed() {


int lastStack = getSupportFragmentManager().getBackStackEntryCount();
try {
    //If the last fragment was named/tagged "three"
    if (getSupportFragmentManager().getFragments().get(lastStack).getTag().toString()=="FragmentD"){

        getSupportFragmentManager().popBackStackImmediate();//skip c
        getSupportFragmentManager().popBackStackImmediate();//skip B
         Fragment fragment = getSupportFragmentManager().findFragmentByTag("FragmentA");
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.fragment_container, fragment);
        transaction.commit();
        return;
    }
} catch (Exception e) {

    e.printStackTrace();
}

super.onBackPressed();
 }

為每個片段制作fragment_container並繼續替換最新片段的fragment_container ..不要忘記:

addToBackStack(null);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM