Объявление Android FragmentTransaction уже вызвано

Моя ошибка:

java.lang.IllegalStateException: commit уже вызванный

Мой КОД:

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

Ответы

Ответ 1

Вы начинаете FragmentTransaction за пределами OnItemClickListener. Таким образом, вы пытаетесь сделать commit() одно FragmentTransaction каждый раз, когда пользователь щелкает элемент в вашем ListView.

Вам нужно начать новый FragmentTransaction каждый раз, когда вы намереваетесь выполнять любое количество операций фрагмента.

Простое исправление будет выглядеть так:

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

Ответ 2

вы можете использовать этот метод для замены фрагмента друг с другом, просто назовите это

делают ли они глобальные

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

И затем назовите его

openFragment(frg1); 

или

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

}

Ответ 3

Ошибка

java.lang.IllegalStateException: commit уже вызванный

показывает, что FragmentTransaction был завершен после вызова commit() в первый раз, и вы снова вызываете commit(), который имеет тенденцию завершить его еще раз. Следовательно, это делает недопустимое состояние для FragmentTransaction.

В соответствии с вашим кодом вы используете тот же FragmentTransaction для изменения фрагментов. Однако после первого вызова commit() FragmentTransaction завершился, и вам нужно снова запустить его для выполнения любой операции на Fragments.

Вы можете изменить свой ClickListner следующим образом:

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

Надеюсь, это очистит ваши сомнения.

Ответ 4

У меня была такая же проблема, и я решил, создав новый экземпляр FragmentTransaction.

Просто добавьте каждый раз ниже строки до добавить/ заменить фрагмент.

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

Надеюсь, это поможет вам.

Ответ 5

Я решил проблему после вызова commit() и снова заменяя фрагмент, вы должны начать с

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

Ответ 6

Посмотрите на этот сценарий

Мне нужно добавить новый фрагмент для каждого элемента списка. Просто инициализировать транзакцию фрагмента при каждом щелчке элемента.

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