简体   繁体   English

Android Correct Fragment BackStack

[英]Android Correct Fragment BackStack

I'm trying to make a correct BackStack . 我正在尝试制作一个正确的BackStack I have tried to implement this decision . 我试图实施这个决定 But it does not work for me. 但它对我不起作用。

I have one list in navigation drawer and other navigation. 我在导航抽屉和其他导航中有一个列表。 So, when I select different fragment lists a few times, I want one-touch return to the main menu instead of returning to 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();
    }


}

You can start by defining these two methods: 您可以从定义这两种方法开始:

A method to push a fragment transaction with a flag that defines if the fragment should be added to the backStack or not: 一种使用标志推送片段事务的方法,该标志定义是否应将片段添加到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();
}

A method that clears out the backStack: 清除backStack的方法:

public void clearStack(){
    FragmentManager fm = this.getSupportFragmentManager();
    fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

Then you only need to handle the following 3 cases: 那你只需要处理以下3种情况:

1) When the activity is newly created you won't add the fragment to the backstack: 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) When you want to add a new fragment to the navigation flow you call the pushToStack method with the addToBackStack set to true : 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) If the wanted fragment to be pushed is the DefaultHomeFragment , clear the stack and then add it as the first time with something like this: 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);
}

This code might give you a better idea: https://github.com/GrzegorzFeather/open-mbsurfer 这段代码可能会给你一个更好的想法: https//github.com/GrzegorzFeather/open-mbsurfer

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM