给大家带来一个fragment 复用栈工具类,适用于多个fragment的切换
package com.teswell.textcar.util;
import android.support.annotation.IdRes;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import java.util.HashMap;
import java.util.Iterator;
/**
* Created by Administrator on 2017/5/2.
* fragment 复用栈
*/
public class FragmentStack {
private int containerViewId;
private FragmentManager fm;
private HashMap<String, Fragment> stack = new HashMap<>();
private String currentFragment = "";
public FragmentStack(@IdRes int containerViewId, FragmentManager fm) {
this.containerViewId = containerViewId;
this.fm = fm;
}
public boolean containsFragemnt(String f) {
return stack.containsKey(f);
}
public Fragment getFragment(String f) {
return stack.get(f);
}
public void remove(String replaced) {
FragmentTransaction ft = fm.beginTransaction();
Fragment fragment = stack.get(replaced);
if (fragment != null) {
ft.remove(stack.get(replaced)).commit();
stack.remove(replaced);
currentFragment = "";
}
}
public void show(Fragment f) {
if (f == null) return;
String showF = f.getClass().getName();
if (showF.equals(currentFragment)) return;
Fragment cacheFragment = stack.get(showF);
FragmentTransaction ft = fm.beginTransaction();
if (stack.get(currentFragment) != null) {
ft.hide(stack.get(currentFragment));
}
if (cacheFragment != null) {
ft.show(cacheFragment)
.commit();
} else {
ft.add(containerViewId, f).commit();
stack.put(showF, f);
}
currentFragment = showF;
}
public void eixt() {
Iterator<Fragment> iterator = stack.values().iterator();
FragmentTransaction ft = fm.beginTransaction();
while (iterator.hasNext()) {
Fragment fragment = iterator.next();
ft.remove(fragment);
}
ft.commit();
stack.clear();
stack = null;
}
}
在界面的使用如下
stack = new FragmentStack(R.id.setting_fragment, getFragmentManager());
展示Fragment
stack.show(fragment);
在fragment退出的时候退出栈
@Override
public void onDestroy() {
super.onDestroy();
stack.eixt();
}