看完這篇文章學會了Dialog,Android開發提升一個檔次

嘚吧嘚

Dialog是什麼呢?

dialog直譯成中文是“會話,對話”的意思。
那麼問題來了,是誰和誰對話呢?enmmmm。。。當然是“人”和“機器”了。
從效果上來看,就是“機器”彈出一個對話的窗口,告訴“人”有哪些選擇或者該進行什麼操作;然後“人”在窗口進行選擇或操作,操作完成之後就完成了“人”和“機器”的一次對話。

以上是通俗的理解,接下來看一下Dialog的Android官方定義

Dialog的Android官方定義:
對話框是提示用戶做出決定或輸入額外信息的小窗口。對話框不會填充屏幕,通常用於需要用戶採取行動才能繼續執行的模式事件。

Dialog的生命週期是啥樣子的?

“生命週期”這個名詞相信大家並不陌生,最基礎也是大家最熟悉的就是Activity的生命週期,如果大家學習過android課程的話,Activity的生命週期是最早學習的內容之一。

Dialog的生命週期:

create -> show -> dismiss

相比於Activity的生命週期也太簡單了吧,就是一個有三個步驟的簡單流程。
在這裏插入圖片描述

本人對“生命週期”這個詞的理解
“生命週期”可以拆分爲“生命”、“周”、“期”三部分。所有“生命”都有“起點”和“終點”兩個點,即“生”和“死”。而在“生”和“死”之間還有做一些事情,而重複做一些事情形成閉環就是“周”這個字,有點周而復始的意味。而“期”這個字指定是,一條生命從“生”開始,重複做一些事情,最後到“死”的這段時間或者期限。(純粹是個人理解,如果理解的不正確請指正)

人比其他動物高級在哪裏?要是細說的話確實有很多方面,在於人強大的學習能力。
在漫長的進化過程中爲了更好的生存下去,不斷的學習製造和使用兵器,不斷學習更多的知識來認識世界,我認爲這也是學習的本質。但後來學習有了更高的境界,通過學習得到一些人生感悟,也就是古人追求的“吾十有五而志於學,三十而立,四十而不惑,五十而知天命,六十而耳順,七十而從心所欲,不逾矩”。

現在已經很少能感受到古人的學習風氣了,說起來也有些傷感。

在理解“生命週期”的過程中有了一絲人生感悟。

個人感悟:
所有生命都有“生”和“死”,但生命的精彩在於“生”和“死”之間做的事情。每個人的選擇不一樣做的事情也不一樣,沒有必要非要去做轟天動地的大事,只要活的充實不虛度光陰就不白在這世間走一遭,平凡而又精彩。

Dialog的使用

爲什麼說學會了Dialog,Android開發提升一個檔次?
想象一個場景——退出登錄
如果不使用Dialog的效果:
在這裏插入圖片描述

像這樣點擊“退出登錄”就直接退出登錄感覺不太友好,爲什麼這麼說呢?再想象一個場景,如果你一不小心碰到了“退出登錄”這個按鈕就直接退出登錄,你再次登錄還要輸入用戶名、密碼、驗證碼等信息,是不是很麻煩呢?現在是不是感覺不太友好了呢?

接下來介紹一下Dialog

普通Dialog

先看效果:
在這裏插入圖片描述
現在是不是感覺比之前的高檔了呢?話不多說,接下來學習一下Dialog怎麼使用。

layout佈局

<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center">

        <Button
            android:id="@+id/dialog"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="退出登錄" />

    </LinearLayout>
</LinearLayout>

MainActivity

Button btn = findViewById(R.id.dialog);
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //通過AlertDialog.Builder實例化一個AlertDialog對象
        AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
        //設置標題
        builder.setTitle("警告");
        //設置圖標
        builder.setIcon(R.drawable.csdn);
        //設置提示信息內容
        builder.setMessage("確定要退出登錄嗎?");
        //確定按鈕(標籤,監聽器)
        builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                finish();
            }
        });
        //取消按鈕(標籤,監聽器)
        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "點擊了取消", Toast.LENGTH_SHORT).show();
            }
        });
        //忽略按鈕(標籤,監聽器)
        builder.setNeutralButton("忽略", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "點擊了忽略", Toast.LENGTH_SHORT).show();
            }
        });
        //顯示彈窗
        builder.create().show();
    }
});

SingleDialog(單選Dialog)

SingleDialo是列表Dialog的一種,只能選擇一個選項。
比較經典的場景就是性別選擇,先看一下效果圖:
在這裏插入圖片描述

首先在layout佈局中加上一個“單選列表”的Button按鈕

<Button
    android:id="@+id/singleDialog"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="單選列表" />

定義可供選擇的性別的列表

final String[] items = {"男", "女", "不告訴你"};

然後構建單選對話框

    private void singleDialog() {
        choice = 0;//默認選擇第一個
        AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
        dialog.setIcon(R.drawable.csdn);//圖標
        dialog.setTitle("性別");
        /**
         * 1.items:定義的單選選項數組
         * 2.checkedItem:默認被選中的選項。默認不選中爲-1,選中數組第一個爲0,選中數組第二個爲1,以此類推
         * 3.listener:監聽器
         */
        dialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                choice = which;
                Toast.makeText(MainActivity.this, "點擊了" + items[which], Toast.LENGTH_SHORT).show();
            }
        });
        //交互按鈕欄
        //確定按鈕(標籤,監聽器)
        dialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, "選擇了" + items[choice], Toast.LENGTH_SHORT).show();
            }
        });
        //添加取消按鈕
        dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        });
        dialog.create().show();
    }

多選Dialog(MultiDialog)

MultiDialog也是列表Dialog的一種,不過是可以多選的列表Dialog。
在這裏插入圖片描述

所有app都有用戶完善個人信息的場景,個人信息中有“愛好”這一欄,先看看看看Dialog的效果:
在這裏插入圖片描述
在layout佈局中添加一個“多選列表”的按鈕

<Button
    android:id="@+id/multiDialog"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="多選列表" />

定義可供選擇的愛好的列表

final String[] hobby = {"吃", "喝", "玩", "樂", "學習", "睡覺"};

構建多選對話彈窗

        choices = new ArrayList<>();
        AlertDialog.Builder multiBuilder = new AlertDialog.Builder(MainActivity.this);
        multiBuilder.setIcon(R.drawable.csdn);
        multiBuilder.setTitle("愛好");
        boolean[] checkedItems = {false, true, false, false, false, false};//android會自動根據你選擇的改變該數組的值。

        for (int i = 0; i < checkedItems.length; i++) {
            if (checkedItems[i] == true) {
                choices.add(i);
            }
        }

        multiBuilder.setMultiChoiceItems(hobby, checkedItems, new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                if (isChecked) {
                    choices.add(which);
                    Toast.makeText(MainActivity.this, "選擇了" + hobby[which], Toast.LENGTH_SHORT).show();
                } else {
                    choices.remove(choices.indexOf(which));
                    Toast.makeText(MainActivity.this, "取消了" + hobby[which], Toast.LENGTH_SHORT).show();
                }
            }
        }).setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String s = "您選擇了:";
                for (Integer item : choices) {
                    s += hobby[item] + "、";
                }
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
            }
        }).setNeutralButton("再想想", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
                Toast.makeText(MainActivity.this, "讓我再想想", Toast.LENGTH_LONG).show();
            }
        }).show();

LoadDialog(加載等待的Dialog)

加載等待效果:
在這裏插入圖片描述

在layout佈局中添加“加載彈窗”的按鈕

<Button
    android:id="@+id/loadDialog"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="加載彈窗" />

構建加載對話框

ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setIcon(R.drawable.csdn);
progressDialog.setMessage("加載中......");
//是否形成一個加載動畫  true表示不明確加載進度形成轉圈動畫  false表示明確加載進度
progressDialog.setIndeterminate(true);
//點擊返回鍵或者dialog四周是否關閉dialog  true表示可以關閉   false表示不可關閉
progressDialog.setCancelable(true);
progressDialog.show();

DownloadDialog(帶有進度條的Dialog)

帶有進度加載的對話彈窗,一般常見於下載任務
效果:
在這裏插入圖片描述

在layout佈局中添加一個“下載彈窗”的按鈕

<Button
    android:id="@+id/downloadDialog"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="下載彈窗" />

構建下載對話彈框

        final int MAX_VALUE = 100;
        final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
        progressDialog.setProgress(0);
        progressDialog.setTitle("文件下載中......");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMax(MAX_VALUE);
        progressDialog.show();
        new Thread(new Runnable() {
            @Override
            public void run() {
                int progress = 0;
                while (progress < MAX_VALUE) {
                    try {
                        Thread.sleep(100);
                        progress++;
                        progressDialog.setProgress(progress);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //加載完畢自動關閉dialog
                progressDialog.cancel();
            }
        }).start();

EditDialog(可輸入的Dialog)

EditDialog是可以編輯的對話彈框

在這裏插入圖片描述
在layout佈局中添加一個“個性簽名”的按鈕

<Button
    android:id="@+id/editDialog"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="個性簽名" />

構建可編輯的對話框

final EditText editText = new EditText(MainActivity.this);
AlertDialog.Builder inputDialog = new AlertDialog.Builder(MainActivity.this);
inputDialog.setTitle("請輸入個性簽名").setView(editText);
inputDialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(MainActivity.this, "您的個性簽名爲:" + editText.getText().toString(), Toast.LENGTH_SHORT).show();
    }
}).setNeutralButton("讓我再想想", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
    }
}).show();

自定義Dialog

可以根據自己的功能需要自定義Dialog,就以調差問卷爲例來學習一下吧。
先看效果:
在這裏插入圖片描述

自己定義的頁面佈局questionnaire.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="你的名字:"
            android:textColor="#111"
            android:textSize="24dp"></TextView>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:inputType="text" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="你的手機:"
            android:textColor="#111"
            android:textSize="24dp"></TextView>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:inputType="phone" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="你的意見:"
            android:textColor="#111"
            android:textSize="24dp"></TextView>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:inputType="text" />

    </LinearLayout>

</LinearLayout>

構建自定義的調查問卷對話框

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this).setView(R.layout.questionnaire);
builder.setTitle("調查問卷");
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(MainActivity.this, "感謝你們完成了調查問卷", Toast.LENGTH_SHORT).show();
    }
}).setNeutralButton("退出", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        Toast.makeText(MainActivity.this, "真遺憾", Toast.LENGTH_SHORT).show();
    }
}).show();

DatePickerDialog(日期選擇彈窗)

在這裏插入圖片描述
在layout佈局中添加新按鈕

<Button
    android:id="@+id/birth"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="設置生日" />

構建日期選擇會話彈窗

//獲取當前系統時間
Calendar calendar = Calendar.getInstance();
// 獲取當前的年
int year = calendar.get(calendar.YEAR);
// 獲取當前的月
int month = calendar.get(calendar.MONTH);
// 獲取當前月的第幾天
final int day = calendar.get(calendar.DAY_OF_MONTH);

DatePickerDialog datePickerDialog = new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        birth.setText(year + "年" + (month + 1) + "月" + day + "日");
    }
}, year, month, day);

datePickerDialog.show();

TimePickerDialog(時間選擇彈窗)

在這裏插入圖片描述
在layout佈局中添加新按鈕

<Button
    android:id="@+id/time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="設置時間" />

構建時間選擇會話彈窗

//獲取當前系統時間
Calendar calendar = Calendar.getInstance();
// 獲取當前的小時
int hour = calendar.get(calendar.HOUR);
// 獲取當前的分鐘
int minute = calendar.get(calendar.MINUTE);

TimePickerDialog timePickerDialog = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        time.setText(hourOfDay + " : " + minute);
    }
}, hour, minute, true);

timePickerDialog.show();

源代碼下載

Dialog的代碼有需要的自行下載一下:Github代碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章