Android activity和fragment的基本封裝

第一步繼承AppCompatActivity 然後讓其他的類來繼承你

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 在界面未初始化之前調用的初始化窗口
        initWidows();

        if (initArgs(getIntent().getExtras())) {
            // 得到界面Id並設置到Activity界面中
            int layId = getContentLayoutId();
            setContentView(layId);
            initBefore();
            initWidget();
            initData();
        } else {
            finish();
        }
    }

解釋一下 當參數初始化失敗就結束activity

第二步寫抽象方法讓子類來繼承

  /**
     * 初始化控件調用之前
     */
    protected void initBefore() {

    }

    /**
     * 初始化窗口
     */
    protected void initWidows() {

    }

    /**
     * 初始化相關參數
     *
     * @param bundle 參數Bundle
     * @return 如果參數正確返回True,錯誤返回False
     */
    protected boolean initArgs(Bundle bundle) {
        return true;
    }

    /**
     * 得到當前界面的資源文件Id
     *
     * @return 資源文件Id
     */
    protected abstract int getContentLayoutId();

    /**
     * 初始化控件
     */
    protected void initWidget() {
        ButterKnife.bind(this);
    }

    /**
     * 初始化數據
     */
    protected void initData() {

    }

第三步就是覆寫回退鍵方法

  @Override
    public boolean onSupportNavigateUp() {
        // 當點擊界面導航返回時,Finish當前界面
        finish();
        return super.onSupportNavigateUp();
    }

    @Override
    public void onBackPressed() {
        // 得到當前Activity下的所有Fragment
        @SuppressLint("RestrictedApi")
        List<Fragment> fragments = getSupportFragmentManager().getFragments();
        // 判斷是否爲空
        if (fragments != null && fragments.size() > 0) {
            for (Fragment fragment : fragments) {
                // 判斷是否爲我們能夠處理的Fragment類型
                if (fragment instanceof net.qiujuer.italker.common.app.Fragment) {
                    // 判斷是否攔截了返回按鈕
                    if (((net.qiujuer.italker.common.app.Fragment) fragment).onBackPressed()) {
                        // 如果有直接Return
                        return;
                    }
                }
            }
        }

        super.onBackPressed();
        finish();
    }
**
     * 設置佔位佈局
     *
     * @param placeHolderView 繼承了佔位佈局規範的View
     */
    public void setPlaceHolderView(PlaceHolderView placeHolderView) {
        this.mPlaceHolderView = placeHolderView;
    }

fragmnet也是差不多的步驟直接貼源碼了

public abstract class Fragment extends androidx.fragment.app.Fragment {
    protected View mRoot;
    protected Unbinder mRootUnBinder;
    protected PlaceHolderView mPlaceHolderView;
    // 標示是否第一次初始化數據
    protected boolean mIsFirstInitData = true;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);

        // 初始化參數
        initArgs(getArguments());

    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (mRoot == null) {
            int layId = getContentLayoutId();
            // 初始化當前的跟佈局,但是不在創建時就添加到container裏邊
            View root = inflater.inflate(layId, container, false);
            initWidget(root);
            mRoot = root;
        } else {
            if (mRoot.getParent() != null) {
                // 把當前Root從其父控件中移除
                ((ViewGroup) mRoot.getParent()).removeView(mRoot);
            }
        }

        return mRoot;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (mIsFirstInitData) {
            // 觸發一次以後就不會觸發
            mIsFirstInitData = false;
            // 觸發
            onFirstInit();
        }

        // 當View創建完成後初始化數據
        initData();
    }

    /**
     * 初始化相關參數
     */
    protected void initArgs(Bundle bundle) {

    }

    /**
     * 得到當前界面的資源文件Id
     *
     * @return 資源文件Id
     */
    @LayoutRes
    protected abstract int getContentLayoutId();

    /**
     * 初始化控件
     */
    protected void initWidget(View root) {
        mRootUnBinder = ButterKnife.bind(this, root);
    }

    /**
     * 初始化數據
     */
    protected void initData() {

    }

    /**
     * 當首次初始化數據的時候會調用的方法
     */
    protected void onFirstInit() {

    }

    /**
     * 返回按鍵觸發時調用
     *
     * @return 返回True代表我已處理返回邏輯,Activity不用自己finish。
     * 返回False代表我沒有處理邏輯,Activity自己走自己的邏輯
     */
    public boolean onBackPressed() {
        return false;
    }


    /**
     * 設置佔位佈局
     *
     * @param placeHolderView 繼承了佔位佈局規範的View
     */
    public void setPlaceHolderView(PlaceHolderView placeHolderView) {
        this.mPlaceHolderView = placeHolderView;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章