已经调用了Android FragmentTransaction提交

JPs*_*JPs 36 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();
        }
    });
Run Code Online (Sandbox Code Playgroud)

Tan*_*.7x 60

你正在开始FragmentTransaction OnItemClickListener.因此,commit()每次用户单击ListView中的项目时,您都会尝试单个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();
    }
});
Run Code Online (Sandbox Code Playgroud)


idr*_*dız 9

您可以使用此方法相互替换片段,只需调用它即可

那些是全球性的

YourFragment1 frg1 = new   YourFragment1 ();    
YourFragment2 frg1 = new   YourFragment2 (); 
Run Code Online (Sandbox Code Playgroud)

然后叫它

openFragment(frg1); 
Run Code Online (Sandbox Code Playgroud)

要么

  openFragment(frg2);
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)


Hir*_*tel 6

我遇到了同样的问题,我通过创建FragmentTransaction.

只需在添加/替换片段之前每次添加以下行即可。

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Run Code Online (Sandbox Code Playgroud)

希望这会对您有所帮助。


小智 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();
        }
    });
Run Code Online (Sandbox Code Playgroud)

我希望它能清除你的怀疑.


小智 5

看这种情况

我需要在每个列表项单击上添加新的片段。只需在每个项目点击上初始化片段交易即可。

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;
            } 
Run Code Online (Sandbox Code Playgroud)