You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio报错:Commit already called问题解决求助

解决FragmentTransaction commit already called异常

这个问题我之前开发嵌套Fragment时也踩过坑!核心问题出在你对FragmentTransaction的使用方式上:一个FragmentTransaction实例只能执行一次commit()操作,一旦调用了commit(),这个事务对象就被消耗掉了,不能再重复使用。

你的代码问题分析

你在onCreateView里初始化了成员变量ft = getFragmentManager().beginTransaction();,第一次点击周一/周二TextView时,调用commit()完成了事务提交;但第二次点击时,你还是用同一个已经被commit过的ft对象去执行replace和commit操作,这就触发了java.lang.IllegalStateException: commit already called异常。

解决方法(最直接推荐)

不要复用FragmentTransaction对象,每次点击时都创建一个全新的事务实例,具体修改如下:

首先去掉类中的成员变量private FragmentTransaction ft;,然后在每个点击事件内部创建事务:

public class subpack extends Fragment {
    // 移除原来的private FragmentTransaction ft;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_subpack, container, false);
        
        //TXT LUNES EVENT LISTENER
        txt_lunes.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                Fragment fragment = new lunes_gestionar();
                // 每次点击都新建事务
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.replace(R.id.fragment,fragment).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).commit();
            }
        });
        
        //TXT MARTES EVENT LISTENER
        txt_martes.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                Fragment fragment = new martes_gestionar();
                // 每次点击都新建事务
                FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.replace(R.id.fragment,fragment).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN).commit();
            }
        });
        
        return view;
    }
}

补充说明

如果你非要复用事务对象(不推荐,容易出错),可以在每次commit()之后重新获取新的事务实例,比如在commit后加上ft = getFragmentManager().beginTransaction();,但这种方式不如每次新建直观,也容易在复杂逻辑中遗漏重置,所以更推荐上面的方法。

内容的提问来源于stack exchange,提问作者Tomas M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:17:37