嗨~各位好

雖然本邊緣人老是在和自己對話

不過能秉著做筆記的精神來...做筆記(?)

最近退伍後開始上班了

一轉眼就過了三個月

接著便會記錄一些上班後遇到的一些用到的功能

那就開始吧


今天要用到的功能是AlertDialog(對話窗格)的各種用法

在各種形況下都會遇到使用AlertDialog

像是基本的通知..到功能選擇

甚至是當作簡易的從使用者取得資料的窗格使用(例如帳號密碼等)

都非常地常見

在這邊將演示四種AlertDialog的用法

簡單一下敘述今天演示的四種功能

1.一般的AlertDialog,不論按下哪一個按鈕選項方格都會自動消失,但可限制返回鍵

2.延伸型Dialog,按下按鈕可設定方格不消失,並且可鎖定灰色區域及返回鍵

3.自定義View型Dialog,並可自由使用裡面的元件

4.自定義Dialog所有的View(含按鈕),並且在Dialog上再放一個Dialog

好的,開始。

GitHub在此:

https://github.com/thumbb13555/AlertDialogExample


一般型的AlertDialog

此對話盒是最基本型的對話盒

基本大致如下:

 

AlertDialog.Builder alertDialog = 
     new AlertDialog.Builder(MainActivity.this);
        alertDialog.setTitle("這是標題");
        alertDialog.setMessage("文字在此");
        alertDialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(getBaseContext(),"確定",Toast.LENGTH_SHORT).show();
            }
        });
        alertDialog.setNegativeButton("中立",(dialog, which) -> {
            setToast("中立");
        });
        alertDialog.setNeutralButton("取消",(dialog, which) -> {
            setToast("取消");
        });
        alertDialog.setCancelable(false);
        alertDialog.show();

(基本上全部複製就可以直接用囉!)

第一行的紅色是確立建立起對話盒

AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);

然後要顯示對話盒則記得要在最後加入.show()喔!

alertDialog.show();

因為程式是順序讀取,因此沒加入的話便會不顯示

此外,假設show寫錯了地方,雖然不會造成崩潰,但是會少顯示寫在show後面的東西

要特別注意

而alertDialog常用的方法有以下

1..setTitle()  設置標題

2.setMessage  設置內容

3.setPositiveButton 設置最右邊按鈕

4.setNegativeButton 設置中間按鈕

5.setNeutralButton 設置最左邊按鈕

 

此外alertDialog還有一個方法就是

.setCeneclable()方法

傳入值為true或false

該方法可以設置是否接受返回鍵使用,但是很遺憾這種alertDialog無法設置無法點擊灰色部分

還有就是一但點選了任何一個按鈕,對話盒都會消失

以上這些方法肯定無法滿足饑渴的你們Ψ(`∀´#)ノ

因此有了以下第二種設計


需手動關閉對話盒的方法

這邊的功能新增了:在按下"確定"時不讓對話盒消失,但是顯示回傳訊息

以下是這種Dialog的程式

AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
        alertDialog.setTitle("這是標題");
        alertDialog.setMessage("文字在此");
        alertDialog.setPositiveButton("確定",((dialog, which) -> {}));
        alertDialog.setNegativeButton("中立",((dialog, which) -> {}));
        alertDialog.setNeutralButton("取消",((dialog, which) -> {}));
        AlertDialog dialog = alertDialog.create();
        dialog.show();
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener((v -> {
            setToast("按了確定但是不給你消失");
        }));
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener((v ->{
            setToast("中立");
            dialog.dismiss();
        }));
        dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener((v -> {
            setToast("取消");
            dialog.dismiss();
        }));

        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);

一樣要先將對話盒建立起來

按鈕設置也要記得設置,但是裡面可以不用寫任何東西

在設完該設置完的條件後,請加入:

AlertDialog dialog = alertDialog.create();

dialog.show();

這兩行

之後聰明的你們肯定會加入按鈕功能的

但這時候如果加入在show之前的話將無法完成點選後不消失的功能

因此必須加入dialog屬性的其中個方法

dialog.getButton

然後將方法延伸

dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClick...

當然,在括弧內的順序要對好,否則會出現牛頭不對馬嘴的情形

最後,加入以下方法

dialog.setCancelable(false); //禁用返回

dialog.setCanceledOnTouchOutside(false);//點擊灰色部分不消失

這樣就可以鎖定返回以及豁色部分囉

最後,因為該方法需要手動將對話盒消失

故必須在條件後加入

dialog.dismiss();

才能讓對話盒消失喔

 

接著在第三個範例中會加入設置自定義View的方法

以下是第三個範例


 

這個範例中我先在外部加了一個Layout

詳細可查看Git內的檔案

https://github.com/thumbb13555/AlertDialogExample/blob/master/app/src/main/res/layout/set_custom_dialog_layout.xml

然後把這個Layout設置好後,使用

getLayoutInflater().inflate這個方法將Layout加入其中

程式如下

AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
        View vvvvvvvv = getLayoutInflater().inflate(R.layout.set_custom_dialog_layout,null);
        alertDialog.setTitle("這是標題");
        alertDialog.setView(v);
        alertDialog.setPositiveButton("確定",(((dialog, which) -> {})));

        AlertDialog dialog = alertDialog.create();
        dialog.show();
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener((v1 -> {
            dialog.dismiss();
        }));


        TextView tvDisplay = vvvvvvvv.findViewById(R.id.textView);
        Switch swPlay = vvvvvvvv.findViewById(R.id.switch1);
        dialog.setCanceledOnTouchOutside(false);
        swPlay.setChecked(status?true:false);
        tvDisplay.setText(swPlay.isChecked()?"開":"關");
        /*此處註解程式已用lambda代替,請參考
        swPlay.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            }
        });*/
        swPlay.setOnCheckedChangeListener((buttonView, isChecked) -> {
            tvDisplay.setText(isChecked?"開":"關");
            status = (isChecked?true:false);
            /*對懶人寫法不熟的請參考註解
            if (isChecked == true){
                tvDisplay.setText("開");
            }else {
                tvDisplay.setText("關");
            }
            */
        });

注意,在設置完Layout後你還不能滿意地看著你的程式說

恩~甚好~(・ω・)b

因為你還沒將你的View告訴你的alertDialog

因此在此呼叫

alertDialog.setView()的方法

並且在括弧內輸入你的View(就是Layout檔案),就可以成功顯示囉

在這個示範中另外還有控制這些view裡的元件

這時候要記得findViewById的前面加入一個 view.find....

這樣才找得到元件喔

備註:為了客倌的方便,我取了很奇怪的名字以為辨別(Git內沒有)

下面那邊則是控件的使用

深藍色的status變數是我有在全域變數中宣告過的Boolean方法

複製上去後記得加入喔

Boolean status = false;

此外,swPlay.isChecked()?"開":"關"

是if...else的懶人寫法

不熟的朋友建議去搜尋了解喔~(・∀・)


最後是大幅度客製化的AlertDialog

除標題可加入色彩,還自訂標題、按鈕、控件等

最後在功能上加入按下後將在AlertDialog再加上一個AlertDialog

示範如下

客製化的部分其實就是在程式中不要去使用內建的方法

轉為什麼都自己設計就是了

綠色的Title是放了個Layout後並把背景設為綠色

裡面的文字也是用TextView寫的

兩個按鈕則是放入按鈕,並把背景設為白

然後加入按鈕監聽器的方法完成

其實搞懂了就意外的超級單純

放上程式吧

AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
        View v = getLayoutInflater().inflate(R.layout.set_custom_dialog_layout_with_button,null);
        alertDialog.setView(v);
        Button btOK = v.findViewById(R.id.button_ok);
        Button btC  = v.findViewById(R.id.buttonCancel);
        EditText editText = v.findViewById(R.id.ededed);
        AlertDialog dialog = alertDialog.create();
        dialog.show();
        btOK.setOnClickListener((v1 -> {
            AlertDialog.Builder twoDialog = new AlertDialog.Builder(MainActivity.this);
            twoDialog.setTitle("這是疊上去的AlertDialog");
            twoDialog.setPositiveButton("瞭解",((dialog1, which) -> {}));
            twoDialog.show();
            }));
        btC.setOnClickListener((v1 -> {setToast(editText.getText().toString());dialog.dismiss();}));

前面的東西都跟上面所教的一樣,就不再贅述

在button的功能內,紅字的部分是在裡面放入一個一般的AlertDialog

其實就是真的意外的超級單純XD

好吧對不起我真的不知道要介紹什麼了(´д`)

有什麼問題就留言吧

反正我也是個菜逼八,不要客氣喔ლↂ‿‿ↂლ


最後,為求方便,我大部分的範例都用lambda語法撰寫

如果不會的朋友們,建議可以去學一下如何使用喔~

真的很方便的(´υ`)

那整理一下四個方法放在這邊做比較

一般AlertDialog

AlertDialog.Builder alertDialog = 
     new AlertDialog.Builder(MainActivity.this);
        alertDialog.setTitle("這是標題");
        alertDialog.setMessage("文字在此");
        alertDialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(getBaseContext(),"確定",Toast.LENGTH_SHORT).show();
            }
        });
        alertDialog.setNegativeButton("中立",(dialog, which) -> {
            setToast("中立");
        });
        alertDialog.setNeutralButton("取消",(dialog, which) -> {
            setToast("取消");
        });
        alertDialog.setCancelable(false);
        alertDialog.show();

可自訂消失與否的Dialog

AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
        alertDialog.setTitle("這是標題");
        alertDialog.setMessage("文字在此");
        alertDialog.setPositiveButton("確定",((dialog, which) -> {}));
        alertDialog.setNegativeButton("中立",((dialog, which) -> {}));
        alertDialog.setNeutralButton("取消",((dialog, which) -> {}));
        AlertDialog dialog = alertDialog.create();
        dialog.show();
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener((v -> {
            setToast("按了確定但是不給你消失");
        }));
        dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener((v ->{
            setToast("中立");
            dialog.dismiss();
        }));
        dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener((v -> {
            setToast("取消");
            dialog.dismiss();
        }));

        dialog.setCancelable(false);
        dialog.setCanceledOnTouchOutside(false);

可自訂Layout的lLertDialog

AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
        View vvvvvvvv = getLayoutInflater().inflate(R.layout.set_custom_dialog_layout,null);
        alertDialog.setTitle("這是標題");
        alertDialog.setView(v);
        alertDialog.setPositiveButton("確定",(((dialog, which) -> {})));

        AlertDialog dialog = alertDialog.create();
        dialog.show();
        dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener((v1 -> {
            dialog.dismiss();
        }));


        TextView tvDisplay = vvvvvvvv.findViewById(R.id.textView);
        Switch swPlay = vvvvvvvv.findViewById(R.id.switch1);
        dialog.setCanceledOnTouchOutside(false);
        swPlay.setChecked(status?true:false);
        tvDisplay.setText(swPlay.isChecked()?"開":"關");
        /*此處註解程式已用lambda代替,請參考
        swPlay.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            }
        });*/
        swPlay.setOnCheckedChangeListener((buttonView, isChecked) -> {
            tvDisplay.setText(isChecked?"開":"關");
            status = (isChecked?true:false);
            /*對懶人寫法不熟的請參考註解
            if (isChecked == true){
                tvDisplay.setText("開");
            }else {
                tvDisplay.setText("關");
            }
            */
        });

完全自訂的AlertDialog,並且可在Dialog上再疊一個Dialog

AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
        View v = getLayoutInflater().inflate(R.layout.set_custom_dialog_layout_with_button,null);
        alertDialog.setView(v);
        Button btOK = v.findViewById(R.id.button_ok);
        Button btC  = v.findViewById(R.id.buttonCancel);
        EditText editText = v.findViewById(R.id.ededed);
        AlertDialog dialog = alertDialog.create();
        dialog.show();
        btOK.setOnClickListener((v1 -> {
            AlertDialog.Builder twoDialog = new AlertDialog.Builder(MainActivity.this);
            twoDialog.setTitle("這是疊上去的AlertDialog");
            twoDialog.setPositiveButton("瞭解",((dialog1, which) -> {}));
            twoDialog.show();
            }));
        btC.setOnClickListener((v1 -> {setToast(editText.getText().toString());dialog.dismiss();}));

 

好了,那今天的筆記就寫到這

希望對各位有幫助!

加油囉各位:)

 

TK2

arrow
arrow

    碼農日常 發表在 痞客邦 留言(3) 人氣()