Search code examples
androidandroid-fragmentsonbackpressed

How to implement onBackPressed in fragment and reach HomeFragment?


I am using 3 Fragment(HomeFragment,RegisterFragment and NewsFragment).How to move from NewsFragment to direct HomeFragment, when I click on Back Button. I don,t want to move to other Fragment ,when I click on Back Button.


Solution

  • I made a utility class which will control my fragment navigation.

    Here is what this class looks like:

    public class FragmentController {
    
        private static final String TAG = FragmentController.class.getCanonicalName();
        private static FragmentController mInstance;
        private ArrayList<BaseFragment> mFragmentsList;
        private BaseActivity mActivity;
        private FrameLayout mFragmentContainer;
    
        public FragmentController(BaseActivity activity) {
            set(activity);
        }
    
        public static FragmentController getInstance(BaseActivity activity) {
            if (mInstance == null)
                mInstance = new FragmentController(activity);
            return mInstance;
        }
    
        public static void setInstance(FragmentController mInstance) {
            FragmentController.mInstance = mInstance;
        }
    
        public void set(BaseActivity activity) {
            mActivity = activity;
            if (mActivity instanceof MainActivity) {
                mFragmentContainer = ((MainActivity) mActivity).getFragmentContainer();
            }
            mFragmentsList = new ArrayList<>();
        }
    
        public void addFirstFragment(BaseFragment fragment) {
            mFragmentsList.add(fragment);
        }
    
        public void presentFragment(BaseFragment fragment, boolean removeAllFromBackstack) {
            try {
                Log.d(TAG, "presentFragment: " + fragment.getTagFm());
                if (mActivity.getCurrentFocus() != null) {
                    ViewUtils.hideKeyboard(mActivity.getCurrentFocus());
                }
                FragmentTransaction ft = mActivity.getSupportFragmentManager().beginTransaction();
                ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out);
                ft.replace(mFragmentContainer.getId(), fragment, fragment.getTagFm());
                ft.addToBackStack(fragment.getTagFm());
                ft.commitAllowingStateLoss();
                if (mFragmentsList.size() != 0)
                    if (removeAllFromBackstack) {
                        if (mFragmentsList.size() == 2) {
                            mFragmentsList.remove(1);
                        } else if (mFragmentsList.size() > 2) {
                            mFragmentsList.subList(1, mFragmentsList.size()).clear();
                        }
                    }
                if (!isFragmentPresent(fragment))
                    mFragmentsList.add(fragment);
            } catch (Exception e) {
                e.printStackTrace();
    
    
     }
    }
    
    public void removeSecondFragment() {
        mFragmentsList.remove(1);
    }
    
    private boolean isFragmentPresent(BaseFragment fragment) {
        for (BaseFragment baseFragment : mFragmentsList) {
            if (baseFragment.getTagFm().equals(fragment.getTagFm()))
                return true;
        }
        return false;
    }
    
    public BaseFragment getCurrentFragment() {
        return mFragmentsList.get(mFragmentsList.size() - 1);
    }
    
    public ArrayList<BaseFragment> getFragmentsList() {
        return mFragmentsList;
    }
    

    }

    Now, I instantiate this class in a Activity

    mFragmentController = FragmentController.getInstance(this);
    

    and now, I do this onBackPressed() from my Activity

    @Override
    public void onBackPressed() {
        if (mFragmentController.getFragmentsList().size() == 1) {
            finish();
        } 
        else {
            mFragmentController.getFragmentsList().remove(mFragmentController.getFragmentsList().size() - 1);
            mFragmentController.presentFragment(mFragmentController.getFragmentsList().get(mFragmentController.getFragmentsList().size() - 1), false);
        }
    }
    

    In FragmentController class, you will see that im using method getTagFm() on BaseFragment class. This is basically for recognizing which fragment is present in que and which is not. BaseFragment class will be something like this:

    public class BaseFragment extends Fragment {
    
     public String getTagFm() {
            if (this.getClass().getSimpleName().equals(LoginFragment.class.getSimpleName())) {
                return Constants.TAG_FRAGMENT_LOGIN;
            } else if (this.getClass().getSimpleName().equals(OrderFragment.class.getSimpleName())) {
                return Constants.TAG_FRAGMENT_ORDER;
            } else if (this.getClass().getSimpleName().equals(ProgramFragment.class.getSimpleName())) {
                return Constants.TAG_FRAGMENT_PROGRAM;
            } 
            return Constants.TAG_FRAGMENT_ORDER;
        }
    
    }
    

    where all of these fragments(LoginFragment, OrderFragment, ProgramFragment) extend BaseFragment.

    Hope this helps somebody.