web-dev-qa-db-fra.com

Android FragmentTransaction commit déjà appelé

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();
        }
    });
29
JPs

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();
    }
});
50
Tanis.7x

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

}
7
idris yıldız

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.

5
Bakshish Singh

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.

3
Hiren Patel

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

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