Android學習筆記--BaseActivity和BaseFragment的再抽取

前言

以前都是對Activity或Fragment進行抽取,封裝成BaseActivity或BaseFragment基類。隨着Activity或Fragment的增加,往往基類的抽象方法就會越來越來多,但是很多時候它們的抽象方法是一樣的。那麼其實可以進一步的抽取,封裝到一個接口當中。

抽取基類思想

  • 父類可以直接加載子類的共同佈局
  • 父類需要定義子類所有的共同方法
  • 父類需要實現子類方法的共同調用邏輯
  • 子類必須實現的方法,那麼父類應該抽象出來
  • 子類有可能重寫的方法,那麼父類不能寫死,應該抽出方法進行默認實現,允許子類重寫

BaseActivity

以前的是這樣的

public abstract class BaseActivity extends FragmentActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        ButterKnife.bind(this);
        initView();
        initData();
        initListener();
    }

    protected abstract void initListener();

    protected abstract void initData();

    protected abstract void initView();

    protected abstract int getLayoutId();
}

當然了實際代碼可能比上面更加複雜。

BaseFragment

以前的是這樣的

public abstract class BaseFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view =View.inflate(getActivity(),getLayoutId(),null);
        ButterKnife.bind(this,view);
        initView();
        initData();
        initListener();
        return view;
    }

    protected abstract void initListener();

    protected abstract void initData();


    protected abstract void initView();

    protected abstract int getLayoutId();
}

更好的改進

BaseActivity

public abstract class BaseActivity extends FragmentActivity implements UiOperation{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(getLayoutId());
        ButterKnife.bind(this);
        initData();
        initListener();
    }

}

BaseFragment

public abstract class BaseFragment extends Fragment implements UiOperation{
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view =View.inflate(getActivity(),getLayoutId(),null);
        ButterKnife.bind(this,view);
        initListener();
        initData();
        return view;
    }
}

UiOperation

public interface UiOperation {
    /**綁定佈局Id**/
    int getLayoutId();
    /**綁定接口*/
    void initListener();

    /**綁定數據**/
    void initData();
}

通過抽取UiOperation,抽取BaseActivity和BaseFragment的公共的方法。

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