- 关于Fragment堆栈的管理已经写过十几次了
- 每次都有新的问题
- 但是这次不一样了,可以更好的管理Fragment
`
public class FuckFragment {
public static final String CURRENT_FRAGMENT = "STATE_FRAGMENT_SHOW";
public static final String FRAGMENTS_TAG = "FRAGMENTS_TAG";//tag
private AppCompatActivity appCompatActivity;
private int fragmentLayoutId;
private Bundle savedInstanceState;
// private int currentIndex = 0;
private String currentTag;//当前展示的fragment的类名,默认值一定要是第一个展示的fragment
private BaseFragment currentFragment = new BaseFragment() {
@Override
public View initView(LayoutInflater inflater, Bundle savedInstanceState) {
return null;
}
@Override
public void initList() {
}
@Override
public void setOnclick() {
}
};
private HashMap<String,BaseFragment> fragmentList;
private ArrayList<String> fragmentTags;
private FuckFragmentCallBack fuckFragmentCallBack;
private FragmentManager fragmentManager;
public FuckFragment(AppCompatActivity appCompatActivity, int fragmentLayoutId,String firstFragmentClassName, Bundle savedInstanceState){
this.appCompatActivity = appCompatActivity;
this.fragmentLayoutId = fragmentLayoutId;
this.savedInstanceState = savedInstanceState;
fragmentList = new HashMap<>();
fragmentTags = new ArrayList<>();
fragmentManager = appCompatActivity.getSupportFragmentManager();
currentTag = firstFragmentClassName;
}
public void onCreate(FuckFragmentCallBack fuckFragmentCallBack){
this.fuckFragmentCallBack = fuckFragmentCallBack;
fuckFragmentCallBack.initFragments(fragmentList);
if(savedInstanceState == null){
//正常启动
showFragment();
}else{
//异常退出后恢复启动
restoreFragment();
}
}
/**
* 异常退出时保存当前显示的Fragment名字
* @param outState
*/
public void onSaveInstanceState(Bundle outState){
outState.putString(CURRENT_FRAGMENT,currentTag);//保存当前显示的Fragment
outState.putStringArrayList(FRAGMENTS_TAG,fragmentTags);//保存所有添加过的FragmentTag
}
/**
* 正常显示fragment
*/
public void showFragment(){
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
BaseFragment showFragment = fragmentList.get(currentTag);
if(!showFragment.isAdded()){
fragmentTransaction.hide(currentFragment);
currentFragment.hind();
String tag = showFragment.getClass().getSimpleName();//获取fragment的绝对类名
fragmentTransaction.add(fragmentLayoutId,showFragment,tag);
fragmentTags.add(tag);//保存已经添加过的fragment类名,作为tag
Log.e("FuckFragment","showFragment :add tag:"+tag);
fragmentTransaction.show(fragmentList.get(currentTag));
fragmentList.get(currentTag).show();
}else{
currentFragment.hind();
fragmentTransaction.hide(currentFragment);
fragmentTransaction.show(fragmentList.get(currentTag));
fragmentList.get(currentTag).show();
}
currentFragment = fragmentList.get(currentTag);
fragmentTransaction.commit();
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);//标准动画
}
/**
* 恢复Fragment
*/
private void restoreFragment(){
currentTag = savedInstanceState.getString(CURRENT_FRAGMENT,currentTag);
fragmentTags = savedInstanceState.getStringArrayList(FRAGMENTS_TAG);
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
for(int i = 0 ; i < fragmentTags.size() ; i ++){
String tag = fragmentTags.get(i);
Log.e("FuckFragment","restoreFragment:tag:"+tag);
// tag = 类名
BaseFragment outFragment = (BaseFragment) fragmentManager.findFragmentByTag(tag);
if(outFragment != null){
fragmentList.put(tag,outFragment);//替换
}
/**
* 遍历所有被保存的fragment
* ps:只会保存已经展示过的
*/
}
for(String fragmentTag : fragmentList.keySet()){
if(fragmentTag.equals(currentTag)){
fragmentTransaction.show(fragmentList.get(fragmentTag));
fragmentList.get(fragmentTag).show();
}else{
fragmentTransaction.hide(fragmentList.get(fragmentTag));
fragmentList.get(fragmentTag).hind();
}
}
fragmentTransaction.commit();
currentFragment = fragmentList.get(currentTag);
}
public void selectFragment(String className){
if(!currentTag.equals(className)){
currentTag = className;
showFragment();
}
}
/**
* 获取当前显示的fragment的名字
* @return
*/
public String getCurrentTag() {
return currentTag;
}
public BaseFragment getFragment(String simpleName){
return fragmentList.get(simpleName);
}
public interface FuckFragmentCallBack{
/**
* 类名 = key
* 实例 = value
* @param fragmentList
*/
public void initFragments(HashMap<String,BaseFragment> fragmentList);
}
}
- 下面是自定义的BaseFragment
public abstract class BaseFragment extends Fragment {
private Context context;
private BaseToastView toastView;
private HomeActivity homeActivity;
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
this.homeActivity = (HomeActivity)context;
}
@Override
public Context getContext() {
return context;
}
public HomeActivity getHomeActivity(){
return homeActivity;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
toastView = new BaseToastView(getContext());
View contentView = initView(inflater,savedInstanceState);
initList();
setOnclick();
return contentView;
}
public abstract View initView(LayoutInflater inflater,Bundle savedInstanceState);
public abstract void initList();
public abstract void setOnclick();
public void toast(String msg){
toastView.getToast().show(msg);
}
public void show(){
}
public void hind(){
}
}