Android FragmentTransaction commit already called

46,852

Solution 1

You are beginning the FragmentTransaction outside of the OnItemClickListener. Thus you are attempting to commit() a single FragmentTransaction every time the user clicks an item in your ListView.

You need to begin a new FragmentTransaction every time you intend to perform any number of Fragment operations.

A simple fix would look like this:

f1_fragment  = new F1_Fragments();
f2_fragment = new F2_Fragments();

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        FragmentTransaction fragmentTransaction =getFragmentManager().beginTransaction();

        parent.getItemAtPosition(position);

        if(position==0){
            fragmentTransaction.replace(android.R.id.content, f1_fragment);
        }else{
            fragmentTransaction.replace(android.R.id.content, f2_fragment);
        }

        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }
});

Solution 2

you can use this method for replace fragment with each other just call this

do those are global

YourFragment1 frg1 = new   YourFragment1 ();    
YourFragment2 frg1 = new   YourFragment2 (); 

And then call it by

openFragment(frg1); 

or

  openFragment(frg2);

OpenFragment:

  private void openFragment(final Fragment fragment)   {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();        
    transaction.replace(R.id.container, fragment);
    transaction.addToBackStack(null);
    transaction.commit();

}

Solution 3

Look at this scenario

I need to add new fragment on every list item click. Just initialise fragment transaction on every item click.

switch (v.getId()) {

                case R.id.tvaddExpense:

                    fragmentTransaction = getFragmentManager().beginTransaction();
                    fragmentTransaction.add(R.id.containerFucntionsList, new Fragment1());
                    fragmentTransaction.addToBackStack(null);
                    fragmentTransaction.commit();
                    break;

                case R.id.relEvents:
                    fragmentTransaction = getFragmentManager().beginTransaction();
                    fragmentTransaction.replace(R.id.containerFucntionsList, new Fragment2());
                    fragmentTransaction.addToBackStack(null);
                    fragmentTransaction.commit();
                    break;
            } 

Solution 4

The Error

java.lang.IllegalStateException: commit already called

shows that the FragmentTransaction has been completed after calling commit() the first time and you are again calling commit() which tends to complete it once again. Hence it makes an Illegal state for the FragmentTransaction.

As per your code, you are using the same FragmentTransaction for changing fragments. However, after the first commit() call, the FragmentTransaction has completed and you need to begin it again to perform any operation on Fragments.

You can change your ClickListner as:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            fragmentTransaction = getSupportFragmentManager().beginTransaction();   

            parent.getItemAtPosition(position);

            if(position==0){
                fragmentTransaction.replace(android.R.id.content, f1_fragment);
            }else{
                fragmentTransaction.replace(android.R.id.content, f2_fragment);
            }

            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    });

I hope it clears your doubt.

Solution 5

I had same issue and I have solved by creating new instance of FragmentTransaction.

Just add everytime below line before add / replace fragment.

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

Hope this would help you.

Share:
46,852

Related videos on Youtube

JPs
Author by

JPs

Updated on July 09, 2022

Comments

  • JPs
    JPs almost 2 years

    My ERROR :

    java.lang.IllegalStateException: commit already called

    My CODE:

    final FragmentTransaction fragmentTransaction =getFragmentManager().beginTransaction();
    
    f1_fragment  = new F1_Fragments();
    f2_fragment = new F2_Fragments();
    
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                parent.getItemAtPosition(position);
    
                if(position==0){
                    fragmentTransaction.replace(android.R.id.content, f1_fragment);
                }else{
                    fragmentTransaction.replace(android.R.id.content, f2_fragment);
                }
    
                fragmentTransaction.addToBackStack(null);
                fragmentTransaction.commit();
            }
        });
    
    • tyczj
      tyczj almost 10 years
      you already made a commit on that transaction, you need to start a new transaction if you want to make a commit again fragmentTransaction = getFragmentManager().beginTransaction();
  • JPs
    JPs almost 10 years
    Thanks!!!! is there a best way to do this? im implementing the Listview in SlidingMenu.
  • Bryan Herbst
    Bryan Herbst almost 10 years
    From what I can see, the pattern you are using looks fine.
  • Ali Sherafat
    Ali Sherafat almost 8 years
    thanks, and also making fragmentManager a private field is a better idea :)
  • H.Gheisari
    H.Gheisari over 5 years
    it works for me. I really appreciate your help. thanks.