近期由于使用单activity和多fragment的框架结构,但是在多指滑动,多点触控时,在fragment的show,hide方法会出现重复添加的异常,Fragment already added,就是相同的fragment在同一时间添加了多个导致这个异常。
通过自己的整理写了一个公共的fragment加载的方法,有需要的可以用一下。亲测好用。
private Fragment currentShowFragment, aFragment, bFragment, cFragment;
private synchronized void showCustomFragment(Fragment showFragment, FragmentManager fragmentManager) {
if (currentShowFragment != null && showFragment == currentShowFragment) {
return;
}
FragmentTransaction transaction = fragmentManager.beginTransaction();
hideAllFragment(transaction);
Fragment tag = fragmentManager.findFragmentByTag(showFragment.getClass().getName());
if (tag == null && !showFragment.isAdded()) {
transaction.add(R.id.fragment_base, showFragment, showFragment.getClass().getName());
}
transaction.show(showFragment);
transaction.addToBackStack(null);
transaction.commitNowAllowingStateLoss();
currentShowFragment = showFragment;
}
/**
* 隐藏全部fragment
*
* @param transaction transaction
*/
private void hideAllFragment(FragmentTransaction transaction) {
if (transaction == null) {
Log.w(TAG, "hideAllFragment: transaction is null");
return;
}
if (aFragment != null && aFragment.isAdded()) {
transaction.hide(aFragment);
}
if (bFragment != null && bFragment.isAdded()) {
transaction.hide(bFragment);
}
if (cFragment != null && cFragment.isAdded()) {
transaction.hide(cFragment);
}
//...
}
showCustomFragment方法就是调用fragment显示的方法,直接使用即可。
hideAllFragment方法是把其他的fragment进行隐藏hide处理。