私のエラー:
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();
}
});
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();
}
});
このメソッドを使用してフラグメントを相互に置き換えることができます
それらはグローバルですか
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();
}
エラー
Java.lang.IllegalStateException:すでに呼び出されたコミット
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();
}
});
それがあなたの疑念をクリアすることを願っています。
私は同じ問題を抱えていましたが、FragmentTransaction
の-新しいインスタンスを作成することで解決しました。
add/replace fragmentの前の行の下にeverytimeを追加するだけです。
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
これがあなたのお役に立てば幸いです。
このシナリオを見てください
リスト項目をクリックするたびに新しいフラグメントを追加する必要があります。ちょうどフラグメントトランザクションの初期化すべてのアイテムクリックで。
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;
}
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();