Mon erreur:
Java.lang.IllegalStateException: commit déjà appelé
Mon 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();
}
});
Vous commencez la FragmentTransaction en dehors de la OnItemClickListener
. Ainsi, vous essayez de commit()
une seule FragmentTransaction chaque fois que l'utilisateur clique sur un élément de votre ListView.
Vous devez commencer une nouvelle FragmentTransaction chaque fois que vous souhaitez effectuer un nombre quelconque d'opérations Fragment.
Une solution simple ressemblerait à ceci:
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();
}
});
vous pouvez utiliser cette méthode pour remplacer fragment les uns avec les autres, appelez simplement cela
est-ce que ceux-ci sont globaux
YourFragment1 frg1 = new YourFragment1 ();
YourFragment2 frg1 = new YourFragment2 ();
Et puis appelez-le par
openFragment(frg1);
ou
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();
}
L'erreur
Java.lang.IllegalStateException: commit déjà appelé
montre que la FragmentTransaction
a été complétée après avoir appelé commit()
pour la première fois et que vous appelez à nouveau commit()
, ce qui tend à le compléter à nouveau Par conséquent, cela crée un état illégal pour le FragmentTransaction
.
Selon votre code, vous utilisez la même FragmentTransaction
pour changer les fragments. Cependant, après le premier appel commit()
, la FragmentTransaction
est terminée et vous devez le recommencer pour effectuer toute opération sur Fragments
.
Vous pouvez changer votre ClickListner
en tant que:
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();
}
});
J'espère que cela efface votre doute.
J'ai eu le même problème et j'ai résolu en créant nouvelle instance of FragmentTransaction
.
Il suffit d’ajouter à chaque fois sous la ligne avant ajouter / remplacer fragment.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
J'espère que cela vous aiderait.
Regardez ce scénario
J'ai besoin d'ajouter un nouveau fragment à chaque clic sur un élément de la liste. Juste initialisez la transaction de fragment sur chaque élément, cliquez.
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;
}
J'ai résolu le problème Après avoir appelé commit()
et avoir à nouveau remplacé le fragment par lequel vous devriez commencer
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();