关于Fragment使用的那些坑,给出一个完美的填坑方式!源码相送

  • 关于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(){

    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值