繼續(xù)上篇,這里繼續(xù)分享我在UI層的設(shè)計(jì)。
UI即用戶接口,也就是用戶界面,即顯示給用戶的部分。Android中,UI部分無(wú)非包括Activity、Fragment以及能夠產(chǎn)生交互的View。而對(duì)于View來(lái)說(shuō),最常用的無(wú)非是列表控件,如RecyclerView、ListView。
因此,XDroid在UI層的封裝主要有:Activity、Fragment、ListAdapter、RecyclerView以及包含Loading、Error、Empty、Content四種狀態(tài)的控件 QTContentLayot&XRecyclerContentLayout。
本著小而美的原則,取消了自定義控件如對(duì)話框的支持,我們可以選擇其他的實(shí)現(xiàn)方式。
Activity & Fragment
Activity & Fragment 擁有不同的生命周期,但卻具有一定的相似性。如Activity有onCreate、onResume、onPause、onStop、onDestory等,而Fragment有onCreateView、onViewCreated、onAttach、onDetach、onDestroyView等。
通常我們都會(huì)搞一個(gè)基類,如BaseActivity & BaseFragment,在BaseActivity中,通常會(huì)包含如下方法:
abstract void initData(Bundle savedInstanceState);
abstract void setListener();
abstract int getLayoutId();
void showLoadingDlg();
void dismissLoadingDlg();
void showPromtDlg();
void dimissPromtDlg();
...
為了Activity & Fragment 保持一致,我抽取了一個(gè)接口UiCallback,如下定義:
public interface UiCallback {
void initData(Bundle savedInstanceState);
void setListener();
int getLayoutId();
boolean useEventBus();
}
并定義兩個(gè)基類XActivity & XFragment,實(shí)現(xiàn)UiCallback接口:
public abstract class XActivity extends AppCompatActivity implements UiCallback{
}
public abstract class XFragment extends Fragment implements UiCallback{
}
而因?yàn)槎x為Abstract,故這幾個(gè)方法需要子類實(shí)現(xiàn)。
寫到這里,分享一下我的心得,有時(shí)搞了個(gè)UserFragment,但隨著業(yè)務(wù)調(diào)整,需要將Fragment修改成Activity,有了當(dāng)前這個(gè)處理,直接可以修改
UserFragment extends XActivity即可。怎樣,是不是很方便...
同時(shí),通常我們會(huì)將一些常用的方法定義在基類Activity&Fragment中,其一這些方法大多相同,需要重復(fù)拷貝,不好維護(hù);其二,大量的公用方法堆積其內(nèi),不好維護(hù)。為了解決這個(gè)問(wèn)題,也為了方便擴(kuò)展,我還是用的接口。
定義一個(gè)接口UiDelegate,其中包含了常用的方法:
public interface UiDelegate {
void resume();
void pause();
void destory();
void visible(boolean flag, View view);
void gone(boolean flag, View view);
void inVisible(View view);
void toastShort(String msg);
void toastLong(String msg);
}
這里我思考了一個(gè)問(wèn)題,如果讓XActivity & XFragment也實(shí)現(xiàn)UiDelegate接口,那么還是需要分別在其內(nèi)實(shí)現(xiàn),達(dá)不到消除冗余的效果。怎么解決這個(gè)問(wèn)題呢?
我想到可以搞一個(gè)UiDelegate的基本實(shí)現(xiàn)UiDelegateBase,只需要在XActivity & XFragment中保留一個(gè)實(shí)力就好了.為了方便,將Context傳進(jìn)去了。
public class UiDelegateBase implements UiDelegate {
public Context context;
private UiDelegateBase(Context context) {
this.context = context;
}
public static UiDelegateBase create(Context context) {
return new UiDelegateBase(context);
}
@Override
public void resume() {
}
@Override
public void pause() {
}
@Override
public void destory() {
}
@Override
public void visible(boolean flag, View view) {
if (flag) view.setVisibility(View.VISIBLE);
}
@Override
public void gone(boolean flag, View view) {
if (flag) view.setVisibility(View.GONE);
}
@Override
public void inVisible(View view) {
view.setVisibility(View.INVISIBLE);
}
@Override
public void toastShort(String msg) {
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
@Override
public void toastLong(String msg) {
Toast.makeText(context, msg, Toast.LENGTH_LONG).show();
}
}
在XActivity & XFragment中,
protected UiDelegate getUiDelegate() {
if (uiDelegate == null) {
uiDelegate = UiDelegateBase.create(this);
}
return uiDelegate;
}
在子類中只需調(diào)用
getUiDelegate.toastLong(msg)
等方法即可。
為何不采用在定義出就new UiDelegate(context)的方式,是因?yàn)檫@種方式可能會(huì)出現(xiàn)null的情況,而使用懶漢模式創(chuàng)建,則有效消除了這種情況。
為了方便,XActivity & XFragment 中集成了事件訂閱,內(nèi)置ButterKnife、EventBus:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.context = this;
if (getLayoutId() > 0) {
setContentView(getLayoutId());
unbinder = KnifeKit.bind(this);
}
setListener();
initData(savedInstanceState);
}
@Override
protected void onStart() {
super.onStart();
if (useEventBus()) {
BusFactory.getBus().register(this);
}
}
@Override
protected void onStop() {
super.onStop();
BusFactory.getBus().unregister(this);
}
可重寫useEventBus方法,決定當(dāng)前Activity & Fragment是否使用EventBus.
EventBus使用了3.0版本
具體實(shí)現(xiàn),可閱讀源碼。XDroid,由于水平有限,可能會(huì)出現(xiàn)一些不合適的地方,歡迎指正。
XDroid業(yè)已基本成熟,歡迎star、fork,提出您的寶貴意見(jiàn)。
這是項(xiàng)目地址:https://github.com/limedroid/XDroid
下一篇,將談?wù)凩istAdapter以及RecylcerView的封裝.