public Fragment showOrCreateFragment(FragmentManager fragmentManager,
int containerLayoutId,
Class<? extends Fragment> fragmentClass,
String tag,
int enter,
int exit,
int popEnter,
int popExit,
boolean bAddToBackStack,
Bundle args) {
List<Fragment> all = fragmentManager.getFragments();
List<Fragment> sameContainer = new ArrayList<Fragment>();
Fragment targetFragment = null;
if (all == null) {
all = new ArrayList<Fragment>();
}
for (Fragment frag : all) {
//寻找同一容器中的fragment
if (frag != null && frag.getView() != null && frag.getView().getParent() != null && ((ViewGroup) frag.getView().getParent()).getId() == containerLayoutId) {
if (frag.getClass() == fragmentClass && tag.equals(frag.getTag())) {
targetFragment = frag; //找到本尊
} else {
sameContainer.add(frag); //找到同窗
}
}
}
//如果指定的fragment不存在,创建并显示出来,隐藏同容器中的其他fragment
boolean isNew = false;
if (targetFragment == null) {
if (args == null) {
targetFragment = Fragment.instantiate(ContextUtil.getContext(), fragmentClass.getCanonicalName());
} else {
targetFragment = Fragment.instantiate(ContextUtil.getContext(), fragmentClass.getCanonicalName(), args);
}
isNew = true;
}
//
FragmentTransaction transaction = fragmentManager.beginTransaction();
//if (enter != -1 && exit != -1 && popEnter != -1 && popExit != -1) {
transaction.setCustomAnimations(enter, exit, popEnter, popExit);
//}
for (Fragment frag : sameContainer) {
transaction.hide(frag);
}
if (isNew) {
transaction.replace(containerLayoutId, targetFragment, tag);
mFragmentShow = false;
} else {
mFragmentShow = true;
transaction.show(targetFragment);
}
if (bAddToBackStack) {
transaction.addToBackStack(null);
//fix bug: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
// transaction.commit();
}
transaction.commitAllowingStateLoss();
return targetFragment;
}
/**
*
* @param fragmentManager
* @param containerLayoutId
* @return
*/
public void removeAllFragment(FragmentManager fragmentManager,
int containerLayoutId){
FragmentTransaction transaction = fragmentManager.beginTransaction();
List<Fragment> all = fragmentManager.getFragments();
List<Fragment> sameContainer = new ArrayList<Fragment>();
Fragment targetFragment = null;
if (all == null) {
all = new ArrayList<Fragment>();
}
for (Fragment frag : all) {
//寻找同一容器中的fragment
if (frag != null && frag.getView() != null && frag.getView().getParent() != null && ((ViewGroup) frag.getView().getParent()).getId() == containerLayoutId) {
sameContainer.add(frag); //找到同窗
}
}
for (Fragment frag : all) {
transaction.remove(frag);
}
transaction.commitAllowingStateLoss();
}
Fragment show add replace 管理帮助方法
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前部分参考:Fragment涉及的add、remove和replace方法和回退栈的关系详解 划重点: add方法...
- Fragment在现在的android开发中已经很常见了,基本所有的app都会涉及到。在Fragment的切换中...
- replace是一个替换的过程,意思是remove掉当前的fragment,重新初始化一个new fragment...
- 【蝴蝶效应】 蝴蝶效应:上个世纪70年代,美国一个名叫洛伦兹的气象学家在解释空气系统理论时说,亚马逊雨林一只蝴蝶...
- fragment中有两种常用的加载方式: replace hide与shou 之前一直没考虑过这个问题,今天突然想...