Neeraj Kumar
Neeraj Kumar

Reputation: 655

How to handle onBackPressed() in multiple fragment

I am Android beginner, I am developing an app in which I have used multiple fragments through an activity.

private void displaySelectedScreen(int itemId) {
        Fragment fragment = null;
        switch (itemId) {

            case R.id.nav_home:
                fragment = new HomeFragment();
                break;

            case R.id.nav_attendance:
                fragment = new AttendanceFragment();
                break;

            case R.id.nav_notification:
                fragment = new NotificationFragment();
                break;

            case R.id.nav_event:
               fragment = new EventFragment();
                break;

            case R.id.nav_fee:
               fragment = new FeesFragment();
                break;

            case R.id.nav_news:
                fragment = new NewsFragment();
                break;

        }
        if (fragment != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.frame_container, fragment);
            ft.addToBackStack(null);
            ft.commit();
        }

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

    }

and use an onBackPressed() method to close an app if the drawer is already close. Now I want to close an app if current fragment is HomeFragment and if current fragment is not HomeFragment then replace by HomeFragment. I don't know, how it does?

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

Upvotes: 0

Views: 1736

Answers (4)

user5607081
user5607081

Reputation: 106

In your MainActivity class override onBackPressed and display dialogbox there like this:

@Override
public void onBackPressed() {
    //show dialog box here 
}

In each Fragment implement onResume() method with following code:

     @Override
    public void onResume() {
        super.onResume();
        getView().setFocusableInTouchMode(true);
        getView().requestFocus();
        getView().setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
              //homefragment class name     
              Class fragmentClass = HomeFragment.class;

             try {

             Fragment  fragment = (Fragment) fragmentClass.newInstance();
             FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                        fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    return true;

                }

                return false;
            }
        });
    }

Upvotes: 0

ZarNi Myo Sett Win
ZarNi Myo Sett Win

Reputation: 1453

Use this code onBackPressed() method in NavigationActivity. I hope that can solve you.

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        Fragment f = getVisibleFragment();// to get which fragment now 
        if (f.getClass() != MainFragment.class) {
            Fragment fragment = null;
            try {
                fragment = (Fragment) MainFragment.class.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }

            FragmentManager fragmentManager = getSupportFragmentManager();
            fragmentManager.beginTransaction().replace(R.id.frame, fragment).commit(); // this is your framelayout
        }else {
            super.onBackPressed();
        }

    }
}

getVisibleFragment() function

public Fragment getVisibleFragment() {
    FragmentManager fragmentManager = NavigationActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    if (fragments != null) {
        for (Fragment fragment : fragments) {
            if (fragment != null && fragment.isVisible())
                return fragment;
        }
    }
    return null;
}

Upvotes: 1

Binh Nguyen
Binh Nguyen

Reputation: 2157

For simple, just go to your HomeFragment.java and edit the method onBackPressed() to exit the application using finish().
And for others Fragment.java, just use popBackStack() function, you can search for it here : https://developer.android.com/reference/android/app/FragmentManager.html#popBackStack()

Upvotes: 0

Rashid
Rashid

Reputation: 1740

You can add tag to your fragment. in this way you will only have to check the tag name.

Fragment fragment = new Fragment();
getFragmentManager().beginTransaction()
    .replace(R.id.FrameLayoutId,fragment,"TAG_NAME")
    .addToBackStack("SOURCE_TAG_NAME").commit(); 

This is how to check your fragment tag, put this checking on your backpress method on the activity or in your closeApp() method

function void closeApp(){
    Fragment fragment = getFragmentManager().findFragmentByTag("HomeActivity");
    if (fragment != null) {
        if(fragment.isVisible()){
            HomeActivity.this.finish(); 
        }
    }
}

Upvotes: 1

Related Questions