AndroidFragment使用时出现java.lang.IllegalStateException:commitalreadycalled
1)说明:如上所说,commit不能被同一个FragmentTransaction调用多次,上面的代码正是违反了这条规定。
将最后一句ft.commit();改为 下面的语句,就不会有异常了。
if (!commit) {
ft.commit();
commit = true;
}
2) 虽然不抛出异常,但是,fragment总是显示不出来。
说明:用如下两种方式来解决:
(1) 利用FragmentTransaction 的add 和remove方式来实现,这样的话,每次都要重新调用FirstFragment的onCreateView函数。代码改为:
。。。。。。
if (btn.getText()==getString(R.string.cancel))
{
ft = getFragmentManager().beginTransaction();
/*为Fragment设置淡入淡出效果,Android开发网提示这里这两个动画资源是android内部资源无需我们手动定义。*/
ft.setCustomAnimations(android.R.animator.fade_in,
android.R.animator.fade_out);
ft.add(fragment, "FragmentTest0000");
ft.commit();
btn.setText(R.string.ok);
t.setText("btn ok!");
}
else {
ft = getFragmentManager().beginTransaction();
/*为Fragment设置淡入淡出效果,Android开发网提示这里这两个动画资源是android内部资源无需我们手动定义。*/
ft.setCustomAnimations(android.R.animator.fade_in,
android.R.animator.fade_out);
ft.remove(fragment);
ft.commit();
btn.setText(R.string.cancel);
t.setText("btn cancel!");
}
(2) 不要把FragmentTransaction ft作为类的数据成员,而是作为本地变量来使用,代码如下:
FragmentTransaction ft = getFragmentManager().beginTransaction();
/*为Fragment设置淡入淡出效果,Android开发网提示这里这两个动画资源是android内部资源无需我们手动定义。*/
ft.setCustomAnimations(android.R.animator.fade_in,
android.R.animator.fade_out);
if (fragment.isHidden()) {
ft.show(fragment);
t.setText("fragment show");
} else {
ft.hide(fragment);
t.setText("fragment hidden");
}
ft.commit();
if (btn.getText()==getString(R.string.cancel))
{
btn.setText(R.string.ok);
t.setText("btn ok!");
}
else {
btn.setText(R.string.cancel);
t.setText("btn cancel!");
}
注意: 这种方式和上一种方式的区别在于:
每次点击button,都是重新创建FragmentTransaction的实例ft,用这个新的实例去操作已经有的fragment,通过hide和show方法。很明显,这种方式不会重新调用FirstFragment的onCreateView函数。
这对于Fragment的生命周期管理是非常重要的。