web-dev-qa-db-ja.com

Android FragmentTransaction commitはすでに呼び出されています

私のエラー:

Java.lang.IllegalStateException:すでに呼び出されたコミット

私のコード:

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

OnItemClickListenerの外部でFragmentTransactionを開始しています。したがって、ユーザーがListViewのアイテムをクリックするたびに、単一のFragmentTransactionをcommit()しようとしています。

任意の数のFragment操作を実行するたびに、新しい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();
    }
});
57
Tanis.7x

このメソッドを使用してフラグメントを相互に置き換えることができます

それらはグローバルですか

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

}
8
idris yıldız

エラー

Java.lang.IllegalStateException:すでに呼び出されたコミット

FragmentTransactioncommit()を最初に呼び出した後に完了し、再度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();
        }
    });

それがあなたの疑念をクリアすることを願っています。

5
Bakshish Singh

私は同じ問題を抱えていましたが、FragmentTransactionの-​​新しいインスタンスを作成することで解決しました。

add/replace fragmentの前の行の下にeverytimeを追加するだけです。

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

これがあなたのお役に立てば幸いです。

4
Hiren Patel

このシナリオを見てください

リスト項目をクリックするたびに新しいフラグメントを追加する必要があります。ちょうどフラグメントトランザクションの初期化すべてのアイテムクリックで。

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

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