Android開發中常用Dialog(普通彈窗&時間選擇器&日歷選擇器)


引言

開發中,我們會有很多地方使用 Dialog 來展示一些提示信息或設置信息。如:用戶提示、進度展示、時間設置、日期設置等。
下面我和大家一些學習下Android中常用的幾種Dialog吧~


首先,先介紹下 Dialog 中那些類的關系
先來一波源碼

public interface DialogInterface {
......
}
public class Dialog implements DialogInterface
......
public class AlertDialog extends Dialog implements DialogInterface {
......
}
public class ProgressDialog extends AlertDialog {
......
}
public class TimePickerDialog extends AlertDialog implements OnClickListener, OnTimeChangedListener {
......
}
public class DatePickerDialog extends AlertDialog implements OnClickListener, OnDateChangedListener {
......
}

從上述代碼中,我們可以看出:

  • Dialog 類 是一個基類。且源碼文檔中也給出了說明:
  • Known Direct Subclasses(已知子類)

AlertDialogCharacterPickerDialogMediaRouteChooserDialogMediaRouteControllerDialogPresentation

  • 開發中,與:進度、時間、日歷 有關的Dialog,繼承於AlertDialog。源碼文檔如下述:
  • Known Direct Subclasses(已知子類)

DatePickerDialogProgressDialogTimePickerDialog


既然明確了繼承關系,那么我們就來用代碼演示下開發中最基本的使用方式(此處只做一些基本的使用演示,更高級的使用后續再和大家共同學習~)

普通的對話框

代碼演示

        //創建一個 AlertDialog.Builder 對象
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        //給對話框添加title
        builder.setTitle("普通對話框");
        //給對話框添加內容
        builder.setMessage("這是一個內容");
        //給對話框添加點擊事件
        builder.setNeutralButton("未知", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.e("對話框", "未知 which = " + which);
            }
        });

        builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.e("對話框", "取消 which = " + which);
            }
        });

        builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.e("對話框", "確定 which = " + which);
            }
        });
        //切記勿忘~開啟dialog
        builder.show();

效果圖(機型不同,展示可能稍有差異,也可以自定義樣式)


帶單選的對話框

代碼演示

        //給 AlertDialog 設置單選(四種參數形式)
        //Builder setSingleChoiceItems(@ArrayRes int itemsId, int checkedItem, final OnClickListener listener)
        //Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn, final OnClickListener listener)
        //Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem, final OnClickListener listener)
        //setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener)
        //參數1:所有選項。參數2:默認一個選擇。參數3:點擊事件監聽
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("單選對話框");
        String[] items = new String[]{"男", "女", "都不是"};
        builder.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
            @Override //which:點擊位置
            public void onClick(DialogInterface dialog, int which) {
                Log.e("對話框", "which = " + which);
            }
        });
        builder.show();

效果圖(機型不同,展示可能稍有差異,也可以自定義樣式)


帶多選的對話框

代碼演示

        //給 AlertDialog 設置多選(三種參數形式)
        //Builder setMultiChoiceItems(@ArrayRes int itemsId, boolean[] checkedItems, final OnMultiChoiceClickListener listener)
        //Builder setMultiChoiceItems(Cursor cursor, String isCheckedColumn, String labelColumn, final OnMultiChoiceClickListener listener)
        //Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, final OnMultiChoiceClickListener listener)
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("多選對話框");
        String[] items = new String[]{"西瓜", "葡萄", "香蕉", "蘋果", "都要"};
        boolean[] checks = new boolean[]{true, false, false, false, false};
        builder.setMultiChoiceItems(items, checks, new DialogInterface.OnMultiChoiceClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                Log.e("對話框", "which = " + which + ", isChecked = " + isChecked);
            }
        });
        builder.show();

效果圖(機型不同,展示可能稍有差異,也可以自定義樣式)


帶進度條的對話框

代碼演示

        final ProgressDialog progress = new ProgressDialog(this);
        progress.setTitle("進度條對話框");
        //設置進度條樣式(可更改,推薦看源碼)
        progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        //設置一個最大進度值
        progress.setMax(100);
        //開啟一個線程模擬進度
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i <= 100; i++) {
                    SystemClock.sleep(100);
                    progress.setProgress(i);
                }
            }
        }).start();
        progress.show();

效果圖(機型不同,展示可能稍有差異,也可以自定義樣式)


時間選擇對話框

代碼演示

        //TimePickerDialog(Context context, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView)
        //TimePickerDialog(Context context, int themeResId, OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView)
        //themeResId:the resource ID of the theme to apply to this dialog
        TimePickerDialog timePicker = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                Log.e("對話框", "hourOfDay = " + hourOfDay + ", minute = " + minute);
            }
        }, 0, 0, true);
        timePicker.show();

效果圖(機型不同,展示可能稍有差異,也可以自定義樣式)


日歷選擇對話框

代碼演示

        //DatePickerDialog要求Android-API最低版本是24
        //DatePickerDialog(Context context)
        //DatePickerDialog(Context context, int themeResId)
        //DatePickerDialog(Context context, OnDateSetListener listener, int year, int month, int dayOfMonth)
        //DatePickerDialog(Context context, int themeResId, OnDateSetListener listener, int year, int monthOfYear, int dayOfMonth)
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            DatePickerDialog datePicker = new DatePickerDialog(this);
            //當我們創建對象的時候,底層源碼調用的都是下述的私有構造器
            //this(context, 0, null, Calendar.getInstance(), -1, -1, -1) 
            // private DatePickerDialog(Context context,
            //                          int themeResId,  //自定義樣式
            //                          OnDateSetListener listener, //監聽
            //                          Calendar calendar, //日歷類
            //                          int year,        //指定年
            //                          int monthOfYear, //指定月
            //                          int dayOfMonth)  //指定日
            datePicker.show();
        }

效果圖(機型不同,展示可能稍有差異,也可以自定義樣式)



PS::期待與大家更多的交流~讓我們共同進步。技術正在改變着世界!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM