Example usage for android.support.v4.app FragmentManager popBackStackImmediate

List of usage examples for android.support.v4.app FragmentManager popBackStackImmediate

Introduction

In this page you can find the example usage for android.support.v4.app FragmentManager popBackStackImmediate.

Prototype

public abstract boolean popBackStackImmediate(int id, int flags);

Source Link

Document

Like #popBackStack(int,int) , but performs the operation immediately inside of the call.

Usage

From source file:uk.co.nevarneyok.ux.MainActivity.java

/**
 * Method clear fragment backStack (back history). On bottom of stack will remain Fragment added by {@link #addInitialFragment()}.
 *///from   w  w w  .j av  a  2s. c o  m
private void clearBackStack() {
    Timber.d("Clearing backStack");
    FragmentManager manager = getSupportFragmentManager();
    if (manager.getBackStackEntryCount() > 0) {
        if (BuildConfig.DEBUG) {
            for (int i = 0; i < manager.getBackStackEntryCount(); i++) {
                Timber.d("BackStack content_%d= id: %d, name: %s", i, manager.getBackStackEntryAt(i).getId(),
                        manager.getBackStackEntryAt(i).getName());
            }
        }
        FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0);
        manager.popBackStackImmediate(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
    Timber.d("backStack cleared.");
    //        TODO maybe implement own fragment backStack handling to prevent banner fragment recreation during clearing.
    //        http://stackoverflow.com/questions/12529499/problems-with-android-fragment-back-stack<
}

From source file:org.comixwall.pffw.MainActivity.java

/**
 * Select the fragment to display./* w w w  .  j  a va 2  s.c o  m*/
 * We modify the backstack ourselves so that no fragment is pushed to the backstack twice.
 * So if a fragment which is already in the backstack is selected, we roll back the backstack
 * to its position.
 * <p>
 * We never push the Dashboard fragment to the backstack because it is always
 * the first fragment displayed (if we push it to the backstack too, pressing the back button
 * while Dashboard fragment is displayed causes a blank activity screen).
 *
 * @param item The menu item selected.
 * @return See {@link NavigationView.OnNavigationItemSelectedListener}
 */
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    // Ignore requests for the same fragment already displayed
    if (!mMenuItems2Fragments.get(id).isInstance(fragment)) {
        FragmentManager fm = getSupportFragmentManager();

        boolean add = true;

        if (id == R.id.menuDashboard) {
            // Dashboard is the main fragment, should never be removed,
            // so remove all backstack entries first to reach the first Dashboard.
            popAllBackStack();

            // Never add Dashboard to the backstack
            add = false;
            fragment = new Dashboard();

            // ATTENTION: menuDashboard does not check initially, so we need to manage it ourselves
            item.setChecked(true);
        } else {
            // TODO: Check why android:checkableBehavior="single" does not uncheck menuDashboard
            MenuItem itemDashboard = navigationView.getMenu().findItem(R.id.menuDashboard);
            if (itemDashboard.isChecked()) {
                itemDashboard.setChecked(false);
            }

            try {
                fragment = (Fragment) mMenuItems2Fragments.get(id).getConstructor().newInstance();
            } catch (Exception e) {
                e.printStackTrace();
                logger.severe("EXCEPTION: " + e.toString());
                return false;
            }
        }

        String fragmentName = fragment.getClass().getSimpleName();

        // Rolls back the backstack if the fragment is already in
        if (!fm.popBackStackImmediate(fragmentName, 0)) {
            android.support.v4.app.FragmentTransaction transaction = fm.beginTransaction();
            transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);

            if (add) {
                transaction.addToBackStack(fragmentName);
            }

            // TODO: Check if we need to pass any args
            //fragment.setArguments(getIntent().getExtras());
            transaction.replace(R.id.fragmentContainer, fragment);

            transaction.commit();
        }
    } else {
        logger.finest("onNavigationItemSelected will not show the same fragment");
    }

    drawer.closeDrawer(GravityCompat.START);
    createOptionsMenu();
    return true;
}