桂芝堂 發表於 2019-9-20 12:36:00

Android开发中常用Dialog(普通弹窗&时间选择器&日历选择器)

<p><strong>引言</strong></p>
<blockquote>
<p>开发中,我们会有很多地方使用 Dialog 来展示一些提示信息或设置信息。如:用户提示、进度展示、时间设置、日期设置等。<br>
下面我和大家一些学习下Android中常用的几种Dialog吧~</p>
</blockquote>
<hr>
<p><strong>首先,</strong>先介绍下 Dialog 中那些类的关系<br>
先来一波源码</p>
<pre><code>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 {
......
}
</code></pre>
<p><strong>从上述代码中,我们可以看出:</strong></p>
<ul>
<li>Dialog 类 是一个基类。且源码文档中也给出了说明:</li>
</ul>
<blockquote>
<ul>
<li>Known Direct Subclasses(已知子类)</li>
</ul>
<blockquote>
<p>AlertDialog,&nbsp;CharacterPickerDialog,&nbsp;MediaRouteChooserDialog,&nbsp;MediaRouteControllerDialog,&nbsp;Presentation</p>
</blockquote>
</blockquote>
<ul>
<li>开发中,与:进度、时间、日历 有关的Dialog,继承于AlertDialog。源码文档如下述:</li>
</ul>
<blockquote>
<ul>
<li>Known Direct Subclasses(已知子类)</li>
</ul>
<blockquote>
<p>DatePickerDialog,&nbsp;ProgressDialog,&nbsp;TimePickerDialog</p>
</blockquote>
</blockquote>
<hr>
<p>既然明确了继承关系,那么我们就来用代码演示下开发中最基本的使用方式(此处只做一些基本的使用演示,更高级的使用后续再和大家共同学习~)</p>
<h3 id="普通的对话框">普通的对话框</h3>
<p><em>代码演示</em></p>
<pre><code>      //创建一个 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();
</code></pre>
<p><em>效果图</em>(机型不同,展示可能稍有差异,也可以自定义样式)<br>
<img src="https://img2018.cnblogs.com/blog/1806065/201909/1806065-20190920123118929-1882469336.jpg"></p>
<hr>
<h3 id="带单选的对话框">带单选的对话框</h3>
<p><em>代码演示</em></p>
<pre><code>      //给 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();
</code></pre>
<p><em>效果图</em>(机型不同,展示可能稍有差异,也可以自定义样式)<br>
<img src="https://img2018.cnblogs.com/blog/1806065/201909/1806065-20190920123149625-633669097.jpg"></p>
<hr>
<h3 id="带多选的对话框">带多选的对话框</h3>
<p><em>代码演示</em></p>
<pre><code>      //给 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();
</code></pre>
<p><em>效果图</em>(机型不同,展示可能稍有差异,也可以自定义样式)<br>
<img src="https://img2018.cnblogs.com/blog/1806065/201909/1806065-20190920123211703-1143722472.jpg"></p>
<hr>
<h3 id="带进度条的对话框">带进度条的对话框</h3>
<p><em>代码演示</em></p>
<pre><code>      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 &lt;= 100; i++) {
                  SystemClock.sleep(100);
                  progress.setProgress(i);
                }
            }
      }).start();
      progress.show();
</code></pre>
<p><em>效果图</em>(机型不同,展示可能稍有差异,也可以自定义样式)<br>
<img src="https://img2018.cnblogs.com/blog/1806065/201909/1806065-20190920123231815-1665585286.jpg"></p>
<hr>
<h3 id="时间选择对话框">时间选择对话框</h3>
<p><em>代码演示</em></p>
<pre><code>      //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();
</code></pre>
<p><em>效果图</em>(机型不同,展示可能稍有差异,也可以自定义样式)<br>
<img src="https://img2018.cnblogs.com/blog/1806065/201909/1806065-20190920123301450-1620779817.jpg"></p>
<hr>
<h3 id="日历选择对话框">日历选择对话框</h3>
<p><em>代码演示</em></p>
<pre><code>      //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 &gt;= 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();
      }
</code></pre>
<p><em>效果图</em>(机型不同,展示可能稍有差异,也可以自定义样式)<br>
<img src="https://img2018.cnblogs.com/blog/1806065/201909/1806065-20190920123316241-568638647.jpg"></p>
<hr>
<hr>
<p>PS::期待与大家更多的交流~让我们共同进步。技术正在改变着世界!</p><br><br>
来源:https://www.cnblogs.com/io1024/p/11556270.html
頁: [1]
查看完整版本: Android开发中常用Dialog(普通弹窗&时间选择器&日历选择器)