zoukankan      html  css  js  c++  java
  • 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::期待与大家更多的交流~让我们共同进步。技术正在改变着世界!

  • 相关阅读:
    Ubuntu下启用IPV6
    时间倒计时(天数+时+分+秒)
    移动端触摸移动相互调换位置
    js移动端点击隐藏和出现指定div(包含少许特效)
    将页面内容保存为图片显示,长按保存至本地(html2canvas)
    移动端触摸上拉隐藏指定模块内容,有过度效果(同时页面iscroll滚动)
    移动端图片缩放(包括滑动查看)
    移动端图片缩放(不包括滑动查看)
    IOS返回页面不刷新的问题
    datePicker(可以同时选择日期和时间)
  • 原文地址:https://www.cnblogs.com/io1024/p/11556270.html
Copyright © 2011-2022 走看看