AlertDialog 點擊按鈕后不關(guān)閉對話框

Button 點擊后自動關(guān)閉

這里的問題:當我點擊確定按鈕搪花,也就是 AlertDialog 里的 PositiveButton 的時候遏片,
我們需要判斷用戶是輸入是否符合我們的預期,
如果不符合通常提示用戶重寫輸入撮竿,且不關(guān)閉當前的對話框吮便,
但上圖中點擊按鈕后會自動的關(guān)閉窗口。

關(guān)于 AlertDialog 的用法見于我的 Dialog 筆記
先看原來的這個是怎么寫的:

private void openDialog() {
    LinearLayout linearLayout = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.change_password_dialog, null);
    final EditText originPasswordEt = (EditText) linearLayout.findViewById(R.id.origin_password);
    TextView forgetPassword = (TextView) linearLayout.findViewById(R.id.forget_password);
   
    final AlertDialog dialog = new AlertDialog.Builder(getContext())
        .setView(linearLayout)
        .setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
                public void onClick(DialogInterface dialog, int which) {
                String originPassword = originPasswordEt.getText().toString().trim();
                    //傳到后臺
                }
        })
        .create();

    dialog.show();
}

雖然圖片里和代碼的并不是同一個幢踏,但問題是一樣的
setPositiveButton 方法中髓需,即使我們沒有調(diào)用 dialog.dismiss()
但對話框還是會自動的關(guān)閉,就算我們在 onClick 里判斷輸入的內(nèi)容惑折,錯誤的提示也會在窗口關(guān)閉后才出現(xiàn)授账。

在 AlertDialog 提供的 API 中我也沒有找到可以設(shè)置的地方,如果有還請告知惨驶。
解決這個問題的辦法可以直接獲取到 Btn 的實例去設(shè)置事件:

final AlertDialog dialog = new AlertDialog.Builder(getActivity())
    .setTitle(msg)
    .setView(layout)
    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    })
    .setPositiveButton("submit",null)
    .setCancelable(true)
    .create();
dialog.show();

//為了防止 getButton() 為空,需要在 OnShowListener 里設(shè)置事件
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        //為了避免點擊 positive 按鈕后直接關(guān)閉 dialog,把點擊事件拿出來設(shè)置
        dialog.getButton(AlertDialog.BUTTON_POSITIVE)
          .setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Pattern pattern = Pattern.compile("[0-9]*");
                Matcher matcher = pattern.matcher(editText.getText());
                if (!matcher.matches()){
                    showToast("請輸入正確的 ID");
                    break;
                }
                dialog.dismiss();
            }
        });
    }
});
  • setPositiveButton("submit",null) 監(jiān)聽事件傳入 null
  • 在調(diào)用 dialog.show() 后再設(shè)置 Button 的點擊事件白热,否則 getButton() 會返回空

這樣在我們手動調(diào)用 dialog.dismiss() 之前,對話框是不會關(guān)閉的粗卜。

以下是 Dialog(support.v7) 的源碼

首先是 AlertDialog 的 setPositiveButton() 為 AlertController.mPositiveButtonListener 賦值

public Builder setPositiveButton(@StringRes int textId, final OnClickListener listener) {
    P.mPositiveButtonText = P.mContext.getText(textId);
    P.mPositiveButtonListener = listener;
    return this;
}

AlertDialog.create() 中調(diào)用 AlertController.apply()

public void apply(AlertController dialog) {
    // ...
    if (mPositiveButtonText != null) {
        dialog.setButton(DialogInterface.BUTTON_POSITIVE, mPositiveButtonText,
                mPositiveButtonListener, null);
    }
    // ...
}

dialog.setButton() 中為 mButtonPositiveMessage 賦值

public void setButton(int whichButton, CharSequence text,
        DialogInterface.OnClickListener listener, Message msg) {
    if (msg == null && listener != null) {
        msg = mHandler.obtainMessage(whichButton, listener);
    }
    // mButtonPositiveMessage.what = DialogInterface.BUTTON_POSITIVE
    // mButtonPositiveMessage.obj = mPositiveButtonListener
    switch (whichButton)  {
        case DialogInterface.BUTTON_POSITIVE:
            mButtonPositiveText = text;
            mButtonPositiveMessage = msg;
            break;
    // ...
}

AlertController 使用 mButtonHandler 為所有的 Button 中轉(zhuǎn) click 事件

private final View.OnClickListener mButtonHandler = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        final Message m;
        if (v == mButtonPositive && mButtonPositiveMessage != null) {
            m = Message.obtain(mButtonPositiveMessage);
        } else if (v == mButtonNegative && mButtonNegativeMessage != null) {
            m = Message.obtain(mButtonNegativeMessage);
        } else if (v == mButtonNeutral && mButtonNeutralMessage != null) {
            m = Message.obtain(mButtonNeutralMessage);
        } else {
            m = null;
        }

        if (m != null) {
            m.sendToTarget();
        }

            // Post a message so we dismiss after the above handlers are executed
        mHandler.obtainMessage(ButtonHandler.MSG_DISMISS_DIALOG, mDialog)
        .sendToTarget();
    }
};

最后在 ButtonHandler 中的 handleMessage() 處理 Message 事件

@Override
public void handleMessage(Message msg) {
    switch (msg.what) {
        case DialogInterface.BUTTON_POSITIVE:
        case DialogInterface.BUTTON_NEGATIVE:
        case DialogInterface.BUTTON_NEUTRAL:
            ((DialogInterface.OnClickListener) msg.obj).onClick(mDialog.get(), msg.what);
            break;
        case MSG_DISMISS_DIALOG:
            ((DialogInterface) msg.obj).dismiss();
    }
}

本文提到的問題就是所有的 click 事件最后都會 send ButtonHandler.MSG_DISMISS_DIALOG 決定了 Dialog 會被 dismiss屋确,所以上面的業(yè)務(wù)不適用 setPositiveButton() 設(shè)置 click 事件。

寫完發(fā)現(xiàn)亂的不行...本來就是很簡單的東西就這樣吧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市攻臀,隨后出現(xiàn)的幾起案子焕数,更是在濱河造成了極大的恐慌,老刑警劉巖刨啸,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堡赔,死亡現(xiàn)場離奇詭異,居然都是意外死亡设联,警方通過查閱死者的電腦和手機善已,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來离例,“玉大人换团,你說我怎么就攤上這事」” “怎么了艘包?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耀盗。 經(jīng)常有香客問我想虎,道長,這世上最難降的妖魔是什么袍冷? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任磷醋,我火速辦了婚禮,結(jié)果婚禮上胡诗,老公的妹妹穿的比我還像新娘。我一直安慰自己淌友,他們只是感情好煌恢,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著震庭,像睡著了一般瑰抵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上器联,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天二汛,我揣著相機與錄音,去河邊找鬼拨拓。 笑死肴颊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的渣磷。 我是一名探鬼主播婿着,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了竟宋?” 一聲冷哼從身側(cè)響起提完,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丘侠,沒想到半個月后徒欣,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蜗字,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年帚称,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秽澳。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡闯睹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出担神,到底是詐尸還是另有隱情楼吃,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布妄讯,位于F島的核電站孩锡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏亥贸。R本人自食惡果不足惜躬窜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炕置。 院中可真熱鬧荣挨,春花似錦、人聲如沸朴摊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甚纲。三九已至口锭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間介杆,已是汗流浹背鹃操。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留春哨,地道東北人荆隘。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像悲靴,于是被迫代替她去往敵國和親臭胜。 傳聞我的和親對象是個殘疾皇子莫其,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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