我的错误:
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();
}
});
答案 0 :(得分:54)
您正在OnItemClickListener
之外开始FragmentTransaction。因此,每次用户单击ListView中的项目时,您都会尝试commit()
单个FragmentTransaction。
每次打算执行任意数量的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();
}
});
答案 1 :(得分:5)
错误
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();
}
});
更改为:
{{1}}
我希望它能解除你的怀疑。
答案 2 :(得分:4)
我遇到了同样的问题,我通过创建FragmentTransaction
的新实例解决了这个问题。
在添加 / 替换片段之前,只需添加每次行。
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
希望这会对你有所帮助。
答案 3 :(得分:3)
看看这个场景
我需要在每个列表项单击上添加新片段。在每个项目点击上只需初始化片段交易。
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;
}
答案 4 :(得分:2)
每次添加片段时,您必须分别定义FragmentTransAction对象:
null
答案 5 :(得分:0)
我解决了这个问题
在调用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();