[英]How can I return to my main activity from another activity that is more than one away in the stack?
[英]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.