Android FragmentTransaction commit already called

偶尔善良 提交于 2019-11-29 02:50:27

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();
    }
});
idris yıldız

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

}
Bakshish Singh

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.

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.

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;
            } 

I solved the issue after calling commit() and again replacing the fragment you should start from

fragmentTransaction = fragmentManager.beginTransaction();

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();
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!