前言
以前都是對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的公共的方法。