Search code examples
androidandroid-fragmentsstackandroid-fragmentactivityfragmentmanager

How to avoid adding same fragment to stack


I need some help. em adding fragment to activity this way. problem is on each call of openFragment it create fragment and add. which is obvious. Question: what modification i do, so it can add fragment only once. on the next call with same fragment tag it will do nothing.

case: press button first time it add fragment and shows. i press again same button it response nothing.

public static void openFragment(Activity activity, Fragment fragment) {

    FragmentManager fragmentManager = ((ActionBarActivity) activity)
            .getSupportFragmentManager();
        FragmentTransaction ftx = fragmentManager.beginTransaction();
        ftx.addToBackStack(fragment.getClass().getSimpleName());
        ftx.setCustomAnimations(R.anim.slide_in_right,
                R.anim.slide_out_left, R.anim.slide_in_left,
                R.anim.slide_out_right);
        ftx.add(R.id.main_content, fragment);
        ftx.commit();
}

Solution

  • Here's the solution, It will only allow you to add fragment once in stack otherwise it will pop-out the very same fragment from stack.

    public static void openFragment(Activity activity, Fragment fragment) {
        String fragmentTag = fragment.getClass().getName();
        FragmentManager fragmentManager= ((ActionBarActivity) activity)
                .getSupportFragmentManager();
    
        boolean fragmentPopped = fragmentManager
                .popBackStackImmediate(fragmentTag , 0);
    
        if (!fragmentPopped && fragmentManager.findFragmentByTag(fragmentTag) == null) {
    
        FragmentTransaction ftx = fragmentManager.beginTransaction();
        ftx.addToBackStack(fragment.getClass().getSimpleName());
        ftx.setCustomAnimations(R.anim.slide_in_right,
                R.anim.slide_out_left, R.anim.slide_in_left,
                R.anim.slide_out_right);
        ftx.add(R.id.main_content, fragment);
        ftx.commit();
      }
    }
    

    slide_in_right

    <?xml version="1.0" encoding="utf-8"?>
      <set xmlns:android="http://schemas.android.com/apk/res/android"
       android:shareInterpolator="true">
      <translate android:fromXDelta="100%"
        android:toXDelta="0%" android:fromYDelta="0%"
        android:toYDelta="0%" android:duration="200">
      </translate>
    </set>
    

    slide_out_right

    <?xml version="1.0" encoding="utf-8"?>
       <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:shareInterpolator="false">
        <translate android:fromXDelta="0%" android:toXDelta="100%"
        android:fromYDelta="0%" android:toYDelta="0%"
        android:duration="200">
      </translate>
    </set>
    

    slide_in_left

    <?xml version="1.0" encoding="utf-8"?>
      <set xmlns:android="http://schemas.android.com/apk/res/android"
      android:shareInterpolator="true">
      <translate android:fromXDelta="-100%"
        android:toXDelta="0%" android:fromYDelta="0%"
        android:toYDelta="0%" android:duration="200">
      </translate>
    </set>
    

    slide_out_left

    <?xml version="1.0" encoding="utf-8"?>
     <set xmlns:android="http://schemas.android.com/apk/res/android"
      android:shareInterpolator="true">
      <translate android:fromXDelta="0%"
        android:toXDelta="-100%" android:fromYDelta="0%"
        android:toYDelta="0%" android:duration="200">
      </translate>
    </set>
    

    And this is how you call this function:

    openFragment(activity, new MyFragment());