[英]Android Correct Fragment BackStack
我正在嘗試制作一個正確的BackStack
。 我試圖實施這個決定 。 但它對我不起作用。
我在導航抽屜和其他導航中有一個列表。 因此,當我選擇不同的片段列表幾次時,我想要一鍵式返回主菜單而不是返回BackStack
。
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() == 1){
finish();
}
else {
super.onBackPressed();
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("theme", mThemeId);
}
private void replaceFragment (Fragment fragment){
String backStateName = fragment.getClass().getName();
String fragmentTag = backStateName;
FragmentManager manager = getSupportFragmentManager();
boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped && manager.findFragmentByTag(fragmentTag) == null) {
FragmentTransaction ft = manager.beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right,
R.anim.slide_back_in_left, R.anim.slide_back_out_right);
ft.replace(R.id.frgmCont, fragment);
ft.addToBackStack(backStateName);
ft.commit();
}
}
您可以從定義這兩種方法開始:
一種使用標志推送片段事務的方法,該標志定義是否應將片段添加到backStack:
private void pushToStack(Fragment fragment, String tag, int transition, boolean addToBackStack){
FragmentManager fm = this.getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.container, fragment, tag);
if(transition > 0){
transaction.setTransition(transition);
}
if(addToBackStack){
transaction.addToBackStack(tag);
}
transaction.commit();
}
清除backStack的方法:
public void clearStack(){
FragmentManager fm = this.getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
那你只需要處理以下3種情況:
1)當新創建活動時,您不會將片段添加到backstack:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_home);
this.pushToStack(DefaultHomeFragment.newInstance(), DefaultHomeFragment.class.getSimpleName(), -1, false);
}
2)當您想要將新片段添加到導航流時,可以將addToBackStack
設置為true
來調用pushToStack
方法:
this.pushToStack(NavigationSecondFragment.newInstance(), NavigationSecondFragment.class.getSimpleName(), DEFAULT_TRANSITION, true);
this.pushToStack(NavigationSecondFragment.newInstance(), NavigationThirdFragment.class.getSimpleName(), DEFAULT_TRANSITION, true);
3)如果要推送的DefaultHomeFragment
片段是DefaultHomeFragment
,請清除堆棧,然后第一次添加它,如下所示:
private static final String DEFAULT_CONTENT_NAME = DefaultHomeFragment.class.getSimpleName();
public addFragmentToNavigation(Fragment newFragment){
boolean addToBackStack = true;
if(newFragment..getClass().getSimpleName().equals(DEFAULT_CONTENT_NAME)){
addToBackStack = false;
this.clearStack();
}
this.pushToStack(newFragment, newFragment.getClass().getSimpleName(),
DEFAULT_TRANSITION, addToBackStack);
}
這段代碼可能會給你一個更好的想法: https : //github.com/GrzegorzFeather/open-mbsurfer
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.