pana doll
pana doll

Reputation: 29

How to replace fragment properly using navigation drawer

I am using navigation drawer and it is simple to use. I am not providing the complete code but providing you detail which could be easy for you to understand my problem. I am using fragments these are about 8 in numbers and I am replacing them with one an other. But here comes a problem I am replacing them on click event of the navigation drawer. but there are two main problems

  1. After replacement , I can see the previous fragment in the background. does replace method just call the new fragment over it ? if yes then what should I do to old fragment not be visible in the background of my new fragment.

  2. When I click navigation drawer Item , it loads the specific fragment successfully. but keeping in that fragment when I click to that specific item again it loads this fragment again and again. For example if drawer item num 3 opens fragment MyBook , then by clicking item num three 2 or many times would open fragment that much time.

So please some one answer me how to cure my app for such kind of actions which I described above.

Upvotes: 1

Views: 659

Answers (3)

vp Shakya
vp Shakya

Reputation: 37

you can use addtobackstack in fragmentstranstion object.like

FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.bodyfragment, new AnotherFragment()); 
transaction.addtoBackStack(null).commit();

Upvotes: 1

Capricorn
Capricorn

Reputation: 2089

Use replace-method of FragmentTransaction instead of add (http://developer.android.com/guide/components/fragments.html#Transactions)

FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.bodyfragment, new AnotherFragment()); 
transaction.commit();

To avoid re-instantiating the fragment, keep track of the current open fragment and only do a fragment transaction, if we next-to-be-opened fragment is a different one than the current. This may achieved like the following:

class MyActivity ... {
  private String currentFragment;

  private void openNewFragment(Fragment fragment) {
      String newFragment = fragment.getClass().getSimpleName();

      if (newFragment.equals(currentFragment)){
          // new fragment already shown
          return;
      }
      // Fragment transaction etc here:
  }
}

Note that this only compares fragments based in their class name. Sometimes this might not be unique, e.g. if there is a DetailFragment class which displays information about an entity. Which entities details to show may depend on intent arguments.

The above code however will then prevent opening DetailFragment for Entity=1 if currently details for Entity=2 are shown. For these scenarios the information about the fragment kept needs to be extended (e.g. storing a Reference or WeakReference to the fragment instance itself).

Upvotes: 0

srinu
srinu

Reputation: 266

I tried like this. Its working fine me

    FragmentManager frgmanager = getFragmentManager();
    frgmanager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    FragmentTransaction frgTransaction = frgmanager.beginTransaction();

    if(subitem.equalsIgnoreCase("subitem")){
        Frag1 frg1 =new Frag1(mCtx);
        frgTransaction.replace(R.id.inflate_layout, frg1);
    }else if(subitem1.equalsIgnoreCase("subitem1")){
        Frag2 frg2 =new Frag2(mCtx);
        frgTransaction.replace(R.id.inflate_layout, frg2);
    }else{
        Frag2 frg3 =new Frag3(mCtx);
        frgTransaction.replace(R.id.inflate_layout, frg3);
    }
    frgTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    frgTransaction.commit();

Upvotes: 1

Related Questions