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
相关产品推荐
相关产品推荐

