Android 開發筆記 用懶加載的方式去加載fragment

基本的框架搭建

/**
         * ****************************************************************
         *                  bottomBar (tabbar)                            *
         * ****************************************************************
         *  Home(tapLayout)     *     find    *    message    *    me     *
         * ****************************************************************
         * follow * Recommend  *              *               *           *
         * ****************************************************************
         * */

1.首先App如果有tabbar可以選擇 BottomBarLayout ,這個tabbar可以實現滿足基本的tabbar的使用范疇。使用方法可以參考github鏈接地址。
2.現在的App一般都是采用的沉浸式狀態欄 ,我這里采用的是ImmersionBar,這個框架非常的好用,使用方法可以參考github連接地址。

  1. tabbar上面有四個模塊 : home 、 find、 messge、 me ,這里我們可以把四個模塊看做成四個fragment,那么,我們不能直接寫四個fragment上面去,因為在開發的過程中會發現出現很多意想不到的問題,所以我們必須寫一個BaseFragment ,這個fragment是,下面介紹一下這個BaseFrament怎么寫:
/**
 * 通過懶加載的形式去加載頁面  大大的提升了App的性能
 * */
public abstract class BaseFragment extends Fragment {

    private KProgressHUD kProgressHUD;

    public SGSharedPrefUtils sgSharedPrefUtils;


    public View view;

    public Activity mContext;

    /**
     * 是否初始化過布局
     */
    protected boolean isViewInitiated;
    /**
     * 當前界面是否可見
     */
    protected boolean isVisibleToUser;
    /**
     * 是否加載過數據
     */
    protected boolean isDataInitiated;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {

        if (view == null) {
            view = inflater.inflate(getLayoutId(), container, false);
            ButterKnife.bind(this, view);

            mContext = getActivity();

            sgSharedPrefUtils = SGSharedPrefUtils.getInstance(mContext);

            this.initData();
        }
        return view;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        isViewInitiated=true;
        //加載數據
        prepareFetchData();
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        this.isVisibleToUser = isVisibleToUser;
        if (isVisibleToUser) {
            prepareFetchData();
        }
    }

    public void prepareFetchData() {
        prepareFetchData(false);
    }


    /**
     * 判斷懶加載條件
     *
     * @param forceUpdate 強制更新,好像沒什么用?
     */
    public void prepareFetchData(boolean forceUpdate) {
        if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
            loadData();
            isDataInitiated = true;
        }
    }

    /**
     * 懶加載
     */
    protected abstract void loadData();

    /**
     * 獲取布局ID
     *
     * @return
     */
    protected abstract int getLayoutId();

    /**
     * 數據初始化操作
     */
    protected abstract void initData();

    @Override
    public void onDestroy() {
        super.onDestroy();
        this.view = null;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.bind(getActivity()).unbind();
    }

    /**
     * [頁面跳轉]
     *
     * @param clz
     */
    public void startActivity(Class<?> clz) {
        startActivity(clz, null);
    }

    /**
     * [攜帶數據的頁面跳轉]
     *
     * @param clz
     * @param bundle
     */
    public void startActivity(Class<?> clz, Bundle bundle) {
        Intent intent = new Intent();
        intent.setClass(getActivity(), clz);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivity(intent);
    }


    /**
     * [含有Bundle通過Class打開編輯界面]
     *
     * @param cls
     * @param bundle
     * @param requestCode
     */
    public void startActivityForResult(Class<?> cls, Bundle bundle,
                                       int requestCode) {
        Intent intent = new Intent();
        intent.setClass(getActivity(), cls);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        startActivityForResult(intent, requestCode);
    }

    public void showToast(String text) {
        Toast.makeText(mContext, text, Toast.LENGTH_LONG).show();
    }
}

4.上面的BaseFragment 我們可以直接的集成到你的App里面去使用了,非常好用 ,它是用過懶加載的形式把界面上面的gragment加載出來,集成BaseFragment后 我們直接在fragment里面實現下面的三個方法就行了:

  /**
     * 懶加載
     */
    protected abstract void loadData();

    /**
     * 獲取布局ID
     *
     * @return
     */
    protected abstract int getLayoutId();

    /**
     * 數據初始化操作
     */
    protected abstract void initData();

5.BaseFragment里面使用一個大家常用的庫 :butterknife ,使用方法可以查看鏈接地址

6.現在可以把所有的fragment都繼承BaseFragment 了 ,然后在loadData方法里面實現網絡請求 ,和設置該fragment

7.四個fragment寫好后就可以放在tabbarActivity里面了 ,這樣我們的tabbar界面基本上就搭建完成了

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容