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

来源:互联网 发布:锻炼视力的软件 编辑:程序博客网 时间:2024/05/21 09:09
  • 关于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(){    }}
原创粉丝点击