static long lastClickTime = 0;
public static Fragment switchPagesByHide(Map<Integer, PairX<String, SoftReference<Fragment>>> map, FragmentManager fragmentManager, int fragment_container_id, int key) {
Fragment fragment;
ArrayList<Fragment> needHideFragments = new ArrayList<>();
for (Integer currentKey : map.keySet()) {
if (currentKey == key) {
continue;
}
PairX<String, SoftReference<Fragment>> pair = map.get(currentKey);
fragment = pair.second.get();
if (fragment == null) {
fragment = fragmentManager.findFragmentByTag(getFragmentTagName(pair.first));
if (fragment != null && fragment.isAdded()) {
needHideFragments.add(fragment);
if (BuildConfig.DEBUG && AppContext.DEBUG_) {
Log.w(TAG, "from tag fragment :" + fragment.getClass().getSimpleName());
}
}
continue;
} else if (fragment.isAdded()) {
needHideFragments.add(fragment);
} else {
fragment = fragmentManager.findFragmentByTag(getFragmentTagName(fragment.getClass()));
if (fragment != null && fragment.isAdded()) {
needHideFragments.add(fragment);
if (BuildConfig.DEBUG && AppContext.DEBUG_) {
Log.w(TAG, " and instance not add,from tag fragment :" + fragment.getClass().getSimpleName());
}
}
}
}
PairX<String, SoftReference<Fragment>> pair = map.get(key);
Fragment currentFragment = pair.second.get();
Fragment tagCurrentFragment = fragmentManager.findFragmentByTag(getFragmentTagName(currentFragment.getClass().getName()));
if (currentFragment == null) {
if (tagCurrentFragment != null) {
currentFragment = tagCurrentFragment;
} else {
try {
currentFragment = (Fragment) Class.forName(pair.first).newInstance();
pair.second = new SoftReference<>(currentFragment);
} catch (Throwable e) {
e.printStackTrace();
}
}
} else if (tagCurrentFragment != null && tagCurrentFragment.isAdded()) {//当前如果tag里面有还是需要隐藏它.
needHideFragments.add(tagCurrentFragment);
}
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
for (Fragment fragment_ : needHideFragments) {
//if (!fragment_.isHidden()) {
if (BuildConfig.DEBUG && AppContext.DEBUG_) {
if (fragment_.isHidden()) {
Log.w(TAG, "REPEAT_HIDE_" + fragment_.getClass().getSimpleName());
} else {
Log.w(TAG, "HIDE_" + fragment_.getClass().getSimpleName());
}
}
fragmentTransaction.hide(fragment_);
// popBackStackImmediate
//}
}
if (!(currentFragment instanceof MyFragment) && !AppUtils.isPadBySizeLarge(AppContext.getInstance())) {//因为隐藏了actionbar,所以会出现白屏,不能动画
long currentMs = System.currentTimeMillis();
if (lastClickTime == 0 || currentMs - lastClickTime > 5500) {
currentFragment.setEnterTransition(createTransition());
currentFragment.setReenterTransition(createTransition());
lastClickTime = currentMs;
if(BuildConfig.DEBUG){
Log.w(TAG,"_fragment anim:"+currentFragment.getClass().getSimpleName());
}
}else{//必须设置,否则依然会因为切换过快导致重复.
currentFragment.setEnterTransition(null);
currentFragment.setReenterTransition(null);
}
}
if (currentFragment.isAdded()) {
if (BuildConfig.DEBUG) {
Log.w(TAG, "FRAGMENT_SHOW:"+currentFragment.getClass().getSimpleName()+",before_hidden:" + currentFragment.isHidden() + ",save:" + currentFragment.isStateSaved() + ",detach:" + currentFragment.isDetached() + ",add:" + currentFragment.isAdded());
}
fragmentTransaction.show(currentFragment);
} else {
if (BuildConfig.DEBUG) {
Log.w(TAG, "FRAGMENT_ADD:" + currentFragment.isHidden() + ",save:" + currentFragment.isStateSaved() + ",detach:" + currentFragment.isDetached() + ",add:" + currentFragment.isAdded() + "," + currentFragment);
}
fragmentTransaction.add(fragment_container_id == 0 ? R.id.fragment_space : fragment_container_id, currentFragment, getFragmentTagName(currentFragment.getClass()));
}
fragmentTransaction.commitAllowingStateLoss();
return currentFragment;
}
解决办法,频繁点击就直接清除动画,不使用动画