简体   繁体   中英

Move straight to home fragment when pressing back button with a NavigationDrawer

I am having trouble in my NavigationDrawer. I want to move to the 1st fragment when pressing the back button no matter on which fragment I am currently in. I have 4 fragments in the NavigationDrawer. I have also added addToBackStack() , but it traverses through all the fragments I have opened previously. I have seen many questions related to this but none were helpful. Here's my code:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

    Fragment fragment = null;
    static Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.toolbarMain);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragment = new ContentMainActivity();
        fragmentTransaction.add(R.id.containerView, fragment).commit();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_about) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.nav_home) {
            fragment = new ContentMainActivity();
        } else if (id == R.id.nav_batches) {
            fragment = new ViewBatches();
        } else if (id == R.id.nav_view_students) {
            fragment = new ViewAllStudents();
        } else if (id == R.id.nav_fee) {
            fragment = new FeePayments();
        }

        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        fragmentTransaction.replace(R.id.containerView, fragment).addToBackStack(null).commit();

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
    ...
}

I finally managed to work out a solution. I did not use backstack. I just used Navigation Drawer's methods for the solution. Here's my code for the people who may be having trouble with the same problem:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

Fragment fragment = null;
static Toolbar toolbar;
NavigationView navigationView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    toolbar = (Toolbar) findViewById(R.id.toolbarMain);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.addDrawerListener(toggle);
    toggle.syncState();

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragment = new ContentMainActivity();
    fragmentTransaction.replace(R.id.containerView, fragment).commit();

    navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
    navigationView.setCheckedItem(R.id.nav_home);
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        if (checkNavigationMenuItem() != 0)
        {
            navigationView.setCheckedItem(R.id.nav_home);
            fragment = new ContentMainActivity();
            getSupportFragmentManager().beginTransaction().replace(R.id.containerView, fragment).commit();
        }
        else
            super.onBackPressed();
    }
}

private int checkNavigationMenuItem() {
    Menu menu = navigationView.getMenu();
    for (int i = 0; i < menu.size(); i++) {
        if (menu.getItem(i).isChecked())
            return i;
    }
    return -1;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_about) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.nav_home) {
        fragment = new ContentMainActivity();
    } else if (id == R.id.nav_batches) {
        fragment = new ViewBatches();
    } else if (id == R.id.nav_view_students) {
        fragment = new ViewAllStudents();
    } else if (id == R.id.nav_fee) {
        fragment = new FeePayments();
    }

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.containerView, fragment).commit();

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

You can try one more thing. You just start your desired fragment in onBackPress call back method. Try below code and replace with your code

@Override
public void onBackPressed() {
fragment = new ContentMainActivity();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.containerView, fragment).addToBackStack(null).commit();
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
    drawer.closeDrawer(GravityCompat.START);
} else {
    super.onBackPressed();
}

}

I am assuming ContentMainActivity is your home fragment you are trying to get. And you can try one more thing when you start your home fragment then add that back stack else don't. In this case if you press back button you will only have one fragment in back stack that will be your home fragment and done.

hope that helps

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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