Android FragmentTransaction commit already called
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.
Related videos on Youtube
JPs
Updated on July 09, 2022Comments
-
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 almost 10 yearsyou 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 almost 10 yearsThanks!!!! is there a best way to do this? im implementing the Listview in SlidingMenu.
-
Bryan Herbst almost 10 yearsFrom what I can see, the pattern you are using looks fine.
-
Ali Sherafat almost 8 yearsthanks, and also making
fragmentManager
a private field is a better idea :) -
H.Gheisari over 5 yearsit works for me. I really appreciate your help. thanks.