Android UI篇——DialogFragment系列四之StatusDialog(Progress脱篙、Success狰腌、Error)實現(xiàn)

《DialogFragment系列一之源碼分析》
《DialogFragment系列二之Dialog封裝》
《DialogFragment系列三之AlertDialog實現(xiàn)》
《DialogFragment系列四之StatusDialog(Progress、Success虐呻、Error)實現(xiàn)》
《DialogFragment系列五之ItemDialog(eg:BottomDialog)實現(xiàn)》
《DialogFragment系列六之常見問題》

此篇基于Dialog定義一個StatusDialog(ProgressDialog象泵、SuccessDialog、ErrorDialog)來滿足用戶操作過程中的各種狀態(tài)斟叼,筆者將三種狀態(tài)集中在一個StatusDialog中偶惠,通過setType來切換,了解之前幾篇文章后代碼看起來就比較簡單犁柜,還是構(gòu)造者模式洲鸠,還是extend Dialog,

效果圖:

ProgressDialog:
ProgressDialog.png
SuccessDialog:
SuccessDialog.png
ErrorDialog:
ErrorDialog.png

代碼實現(xiàn):

public class StatusDialog extends Dialog {

    private Handler mMainHandler = new Handler();
    /**
     * 成功或錯誤2s后dismiss
     */
    public static final int DELAY_TIME = 2000;
    private DialogParams mDialogParams;
    private Timer mDelayTimer;

    private StatusDialog() {
        mDialogParams = new DialogParams();
    }

    public static Builder with(AppCompatActivity activity) {
        return new Builder(activity);
    }

    @Override
    protected int setLayoutRes() {
        return R.layout.dialog_status;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        TextView tvDialogStatusContent = view.findViewById(R.id.tv_dialog_status_prompt);
        ImageView imgDialogStatusShow = view.findViewById(R.id.img_dialog_status_show);
        ProgressBar pbDialogStatusShow = view.findViewById(R.id.pb_dialog_status_show);

        //更換圓形進度條顏色
        pbDialogStatusShow.getIndeterminateDrawable()
                .setColorFilter(getResources().getColor(R.color.colorPrimaryDark), PorterDuff.Mode.SRC_ATOP);

        //填充數(shù)據(jù)
        if (isNonEmpty(mDialogParams.prompt)) {
            tvDialogStatusContent.setText(mDialogParams.prompt);
        }

        switch (mDialogParams.type) {
            case Type.ERROR:
                pbDialogStatusShow.setVisibility(View.GONE);
                imgDialogStatusShow.setVisibility(View.VISIBLE);
                imgDialogStatusShow.setImageResource(R.mipmap.icon_dialog_error);
                break;
            case Type.SUCCESS:
                pbDialogStatusShow.setVisibility(View.GONE);
                imgDialogStatusShow.setVisibility(View.VISIBLE);
                imgDialogStatusShow.setImageResource(R.mipmap.icon_dialog_success);
                break;
            case Type.PROGRESS:
                imgDialogStatusShow.setVisibility(View.GONE);
                pbDialogStatusShow.setVisibility(View.VISIBLE);
                break;
        }
    }

    @Override
    protected boolean setCancelable() {
        return mDialogParams.isCancelable;
    }

    @Override
    public void onStart() {
        super.onStart();
        /**
         * 顯示定時間后自動dismiss
         */
        if (mDialogParams.type == Type.SUCCESS || mDialogParams.type == Type.ERROR) {
            cancelTimer();
            mDelayTimer = new Timer();
            mDelayTimer.schedule(new TimerTask() {
                @Override
                public void run() {
                    mMainHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            dismiss();
                        }
                    });
                }
            }, DELAY_TIME);
        }
    }

    private void cancelTimer() {
        if (mDelayTimer != null) {
            mDelayTimer.cancel();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        cancelTimer();
    }

    public class DialogParams {
        String prompt;
        boolean isCancelable;
        int type = -1;
    }

    public static class Builder {
        AppCompatActivity activity;
        DialogParams P;
        StatusDialog progressDialog;

        public Builder(AppCompatActivity activity) {
            progressDialog = new StatusDialog();
            this.P = progressDialog.mDialogParams;
            this.activity = activity;
        }

        public Builder setPrompt(String val) {
            P.prompt = val;
            return this;
        }

        public Builder setCancelable(boolean val) {
            P.isCancelable = val;
            return this;
        }

        public Builder setType(int val) {
            P.type = val;
            return this;
        }

        public StatusDialog show() {
            if (P.type == -1) {
                throw new IllegalArgumentException("Please set type");
            }
            progressDialog.show(activity);
            return progressDialog;
        }
    }

    public interface Type {

        int PROGRESS = 0x000000000211;

        int ERROR = 0x000000000985;

        int SUCCESS = 0x00000000011;

    }
}

SuccesDialog和ErrorDialog show后果幾秒自動dismiss馋缅,ProgressDialog可通過網(wǎng)絡(luò)請求集中封裝來show和dismiss,例如在網(wǎng)絡(luò)請求onStart()中調(diào)用show绢淀,onComplete()中調(diào)用dismiss萤悴,提供外部使用接口with(),讀者據(jù)此擴展屬性或更換布局皆的。

讀者有問或其他觀點請留言交流覆履,共同進步!

源碼Github傳送門,覺得不錯就給個star吧硝全,謝謝栖雾!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市伟众,隨后出現(xiàn)的幾起案子析藕,更是在濱河造成了極大的恐慌,老刑警劉巖凳厢,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件账胧,死亡現(xiàn)場離奇詭異,居然都是意外死亡先紫,警方通過查閱死者的電腦和手機治泥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來遮精,“玉大人居夹,你說我怎么就攤上這事”境澹” “怎么了吮播?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長眼俊。 經(jīng)常有香客問我意狠,道長,這世上最難降的妖魔是什么疮胖? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任环戈,我火速辦了婚禮,結(jié)果婚禮上澎灸,老公的妹妹穿的比我還像新娘院塞。我一直安慰自己,他們只是感情好性昭,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布拦止。 她就那樣靜靜地躺著,像睡著了一般糜颠。 火紅的嫁衣襯著肌膚如雪汹族。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天其兴,我揣著相機與錄音顶瞒,去河邊找鬼。 笑死元旬,一個胖子當著我的面吹牛榴徐,可吹牛的內(nèi)容都是我干的守问。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼坑资,長吁一口氣:“原來是場噩夢啊……” “哼耗帕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起袱贮,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤仿便,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后字柠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體探越,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年窑业,在試婚紗的時候發(fā)現(xiàn)自己被綠了钦幔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡常柄,死狀恐怖鲤氢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情西潘,我是刑警寧澤卷玉,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站喷市,受9級特大地震影響相种,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜品姓,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一寝并、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腹备,春花似錦衬潦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至友驮,卻和暖如春漂羊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背喊儡。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工拨与, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艾猜。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓买喧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匆赃。 傳聞我的和親對象是個殘疾皇子淤毛,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容