已经调用了Android FragmentTransaction提交

时间:2014-07-03 19:27:09

标签: android android-fragments 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();
        }
    });

6 个答案:

答案 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已经调用

表示第一次调用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(); } }); 更改为:

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