Fragment 的回退栈
创建MvpFragmentManager :
//Fragment 的回退栈
public class MvpFragmentManager {
public static BaseFragment addOrShowFragment(FragmentManager manager, Class<? extends BaseFragment> fragmentClass, BaseFragment lastFragment, @IdRes int containerId) {
//获取碎片管理器
FragmentTransaction transaction = manager.beginTransaction();
// 获取fragment 的name
String tag = fragmentClass.getName();
// 获取fragment
BaseFragment baseFragment = (BaseFragment) manager.findFragmentByTag(tag);
if (baseFragment == null) { // 当前activity 已经添加了 该fragment
try {
//得到fragment的实体对象
baseFragment = fragmentClass.newInstance();
/**
* 比如: 从A里面要显示B, B就是将要显示的fragment,A就是上一个fragment
* 第一个enter: 表示将要显示的fragment 进入的动画
* 第二个exit :表示上一个fragment 退出的动画
* 第三个popEnter: 表示按返回键是上一个fragment 弹进的动画
* 第四个popExit :表示按返回键时 将要显示的fragment被弹出的动画,
*/
//通过碎片管理器设置自定义动画
transaction.setCustomAnimations(baseFragment.getEnterAnimation(),
(lastFragment == null ? 0 : lastFragment.getExitAnimation()),
(lastFragment == null ? 0 : lastFragment.getPopEnterAnimation()),
baseFragment.getPopExitAnimation());
//添加fragment
transaction.add(containerId, baseFragment, tag);
//如果添加到返回中堆
if (baseFragment.isNeedAddToBackStack()){
}
// 将 fragment 添加到回退栈中
transaction.addToBackStack(tag);//把这一次事务添加到回退栈里面
} catch (Exception e) {
e.printStackTrace();
}
} else { // 当前 activity 已经添加过这个fragment 有移除了
int count = manager.getBackStackEntryCount();//获取回退栈里面 事务的个数
//通过事务将
FragmentManager.BackStackEntry entry=null;
for (int i = 0; i < count; i++) {
entry=manager.getBackStackEntryAt(i);
if (entry.getName().equals(tag)){
//弹出栈
manager.popBackStackImmediate(tag,0);
return baseFragment;
}
}
/* if (count>0){
manager.popBackStackImmediate(manager.getBackStackEntryAt(0).getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
return baseFragment;
}*/
if (!baseFragment.isAdded()) { // 如果没有添加
transaction.add(containerId, baseFragment, tag);
}
if (baseFragment.isDetached()) { // 如果从activity detach(分离) 了
transaction.attach(baseFragment);
}
if (baseFragment.isHidden()) {// 如果被隐藏了
transaction.show(baseFragment);
}
}
if (lastFragment != null) { // 如果之前有fragment 存在。即上一个fragment
transaction.hide(lastFragment); // 对该fragment 隐藏
}
handPreFragment(transaction,lastFragment,baseFragment);
// 提交
transaction.commit();
return baseFragment; // 把自己(即将要显示的) 返回出去。
}
private static void handPreFragment(FragmentTransaction transaction,BaseFragment lastFragment,BaseFragment willShowFragment){
if (lastFragment!=null){
switch (willShowFragment.getActionFroPreFragment()){
case REMOVE:
//删除当前
transaction.remove(lastFragment);
break;
case DETACH:
//分离当前
transaction.detach(lastFragment);
break;
case HIDE:
//隐藏当前
transaction.hide(lastFragment);
break;
}
}
}
}
监听使用
MvpFragmentManager.addOrShowFragment(getFragmentManager(),FragmentB.class,FragmentA.this,R.id.home_fragment_container);
网友评论