0

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();
    }
}
Neeraj Kumar
  • 645
  • 1
  • 7
  • 15
  • check the count of the fragments when you are pressing back button. Pop the fragment from the stack until you reach the 0th fragment. Check for a condition to check whether the size of the stack is 0. If yes, finish the activity. – SripadRaj Jul 10 '17 at 09:47

4 Answers4

1

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(); 
        }
    }
}
Rashid
  • 1,700
  • 1
  • 23
  • 56
1

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;
}
ZarNi Myo Sett Win
  • 1,353
  • 5
  • 15
  • 37
0

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()

Oleksandr
  • 6,226
  • 1
  • 46
  • 54
Binh Nguyen
  • 1,891
  • 10
  • 17
0

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;
            }
        });
    }
Satan Pandeya
  • 3,747
  • 4
  • 27
  • 53