Search code examples
javaandroidback-buttonnavigation-draweronbackpressed

onBackPressed() method doesn't work as expected in Android Navigartion Drawer


I'm trying to implement android navigation drawer. The problem is on my onBackPressed() method. when back button is pressed it redirect to my MainActivity. But I want to use it for go previous page from my present page. I tried a lot but can't do. There is no error on my logCat.

so my onBackPressed() is like this

@Override
public void onBackPressed() {
    Intent i=new Intent(MainActivity.this,MainActivity.class);
    startActivity(i);
    return;
}

so now how to solve my problem. For you're understanding there is my MainActivity code

package spurs.cafesoft.travelersguide;

import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

import spurs.cafesoft.travelersguide.fragment.Fragment_barishal;
import spurs.cafesoft.travelersguide.fragment.Fragment_chittagong;
import spurs.cafesoft.travelersguide.fragment.Fragment_dhaka;
import spurs.cafesoft.travelersguide.fragment.Fragment_home;
import spurs.cafesoft.travelersguide.fragment.Fragment_khulna;
import spurs.cafesoft.travelersguide.fragment.Fragment_main;
import spurs.cafesoft.travelersguide.fragment.Fragment_mymensingh;
import spurs.cafesoft.travelersguide.fragment.Fragment_rajshahi;
import spurs.cafesoft.travelersguide.fragment.Fragment_rangpur;
import spurs.cafesoft.travelersguide.fragment.Fragment_sylhet;

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "ns.nayem350@gmail.com", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    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.setDrawerListener(toggle);
    toggle.syncState();

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


    FragmentManager fm = getFragmentManager();
    fm.beginTransaction().replace(R.id.frame_layout, new Fragment_main()).commit();
}

@Override
public void onBackPressed() {
    Intent i=new Intent(MainActivity.this,MainActivity.class);
    startActivity(i);
    return;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {

    // Handle navigation view item clicks here.

    FragmentManager fm =getFragmentManager();

    int id = item.getItemId();
    if (id==R.id.home){
        fm.beginTransaction().replace(R.id.frame_layout,new Fragment_home()).commit();
    }

    else if (id == R.id.dhaka) {

        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_dhaka()).commit();

    } else if (id == R.id.chittagong) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_chittagong()).commit();

    } else if (id == R.id.barishal) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_barishal()).commit();
    } else if (id == R.id.rajshahi) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_rajshahi()).commit();

    } else if (id == R.id.khulna) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_khulna()).commit();

    } else if (id == R.id.sylhet) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_sylhet()).commit();
    }else if (id == R.id.rangpur) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_rangpur()).commit();

    }else if (id == R.id.mymensingh) {
        fm.beginTransaction().replace(R.id.frame_layout, new Fragment_mymensingh()).commit();
    }

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

Solution

  • You have to add the transaction to the backstack when you replace your fragments. In that way you do not need the custom onBackPressed code and it should work fine.

    The backstack is a stack that the android system uses to navigate back to previous system states, which is what you want when people pressing the back button.

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(..............);
    fragmentTransaction.addToBackStack(null);
    fragmentTransaction.commit();    
    

    Example using your code

     fm.beginTransaction().replace(R.id.frame_layout, new Fragment_mymensingh()).addToBackStack(null).commit();