我是如何搭建Android快速開(kāi)發(fā)框架的之UI篇(上)

繼續(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的封裝.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容