【Android】常用对话框大全(一)Android Dialog

2023-11-15

Android的对话框有多少种?Android好看的对话框有很多,如Android、material、qmui、xui、kongzue等系列对话框,但博主只打算讲解Android、material系列对话框,讲太多没必要,实在想要做成人家那样的对话框,花点时间自定义一下就好。

Android常用对话框系列文章

【Android】常用对话框大全(一)Android Dialog

【Android】常用对话框大全(二)Material Dialog

【Android】常用对话框大全(三)自定义Dialog的三种方式(Theme,PopupWindow,Dialog)

AlertDialog系列

AlertDialog系列对话框,实现方式皆与AlertDialog类相关,可以说,一个类便可实现了多种类型对话框。

提示对话框

在这里插入图片描述
实现代码:

AlertDialog.Builder(this)
            .setTitle("消息对话框")
            .setMessage("这是一个消息对话框!")
            .setNegativeButton("不像") { dialog: DialogInterface?, which: Int -> showMessage("真不像?") }
            .setPositiveButton("明明就是") { dialog: DialogInterface?, which: Int -> showMessage("明明就是") }
            .show()
use methods Describe
setTitle(CharSequence title) 设置对话框中显示的标题
setMessage(CharSequence message) 设置要显示的消息
setNegativeButton(CharSequence text, final OnClickListener listener) 设置按下对话框的否定按钮时要调用的侦听器
setPositiveButton(CharSequence text, final OnClickListener listener) 设置按下对话框的肯定按钮时要调用的侦听器

左右按钮对话框

在这里插入图片描述
实现代码:

AlertDialog.Builder(this)
            .setMessage("左右按钮对话框!")
            .setNeutralButton("左") { dialog: DialogInterface?, which: Int -> showMessage("左") }
            .setPositiveButton("右") { dialog: DialogInterface?, which: Int -> showMessage("右") }.show()
use methods Describe
setMessage(CharSequence message) 设置要显示的消息
setNeutralButton(CharSequence text, final OnClickListener listener) 设置按下对话框的中性按钮时要调用的侦听器
setPositiveButton(CharSequence text, final OnClickListener listener) 设置按下对话框的正按钮时要调用的侦听器

列表对话框

在这里插入图片描述
实现代码:

AlertDialog.Builder(this)
            .setItems(items) { dialog: DialogInterface?, which: Int -> showMessage("点击了列表对话框的 " + items[which]) }
            .show()
use methods Describe
setItems(CharSequence[] items, final OnClickListener listener) 设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器通知您选择的项目

单选对话框

在这里插入图片描述
实现代码:

AlertDialog.Builder(this)
            .setTitle("单选对话框")
            .setSingleChoiceItems(items,0) { dialog: DialogInterface?, which: Int -> 
            	singleSelectResult = items[which] 
            }
            .setPositiveButton("确定") { dialog: DialogInterface?, which: Int ->
                showMessage(singleSelectResult)
            }
            .show()
use methods Describe
setTitle(CharSequence title) 设置Dialog中显示的标题
setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener) 设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。该列表将在选中项目的文本右侧显示一个复选标记。单击列表中的项目不会关闭对话框。单击按钮将关闭对话框。
setPositiveButton(CharSequence text, final OnClickListener listener) 设置按下对话框的正按钮时要调用的侦听器

多选对话框

在这里插入图片描述
实现代码:

val bool = booleanArrayOf(false, false, false, false)
        AlertDialog.Builder(this)
            .setTitle("多选对话框")
            .setMultiChoiceItems(items,bool) { dialog: DialogInterface?, which: Int, isChecked: Boolean -> }
            .setPositiveButton("确定") { dialog: DialogInterface?, which: Int ->
                var result = "选中了"
                for (i in bool.indices) {
                    if (bool[i]) {
                        result += items[i]
                    }
                }
                showMessage(result)
            }.show()
use methods Describe
setTitle(CharSequence title) 设置Dialog中显示的标题
setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, final OnMultiChoiceClickListener listener) 设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。该列表将在每个选中项目的文本右侧显示一个复选标记。单击列表中的项目不会关闭对话框。单击按钮将关闭对话框。
setPositiveButton(CharSequence text, final OnClickListener listener) 设置按下对话框的正按钮时要调用的侦听器

圆环进度条对话框(自定义)

圆环进度条对话框同水平进度条对话框一样,在低版本的Android系统可直接使用ProgressDialog展示(可参考下方的进度条对话框),设置参数将setProgressStyle(int style)的参数改为ProgressDialog.STYLE_SPINNER即可。
如果需要自定义Android对话框,步骤与水平进度条对话框相似,只是布局不同,如下:

1、xml布局

<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="horizontal">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"/>

    <TextView
        android:id="@+id/percentage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="正在下载..."
        android:textSize="16dp"
        android:textStyle="bold"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"/>
</LinearLayout>

2、Java中设置

AlertDialog.Builder alertDialog = new AlertDialog.Builder(this);
View inflate = LayoutInflater.from(this).inflate(R.layout.progress_bar2, null);
// 设置一直滚动的效果
for (int i = 0; i <= 100 ; i++) {
    if (i == 0){
        i = 100;
    }
    ((ProgressBar)inflate.findViewById(R.id.progressBar)).setProgress(i);
}
alertDialog.setView(inflate);
AlertDialog dialog = alertDialog.create();
dialog.show();
// 设置对话框宽高,要先show()再设置才回生效
Window window = dialog.getWindow();
WindowManager.LayoutParams attributes = window.getAttributes();
attributes.width = 700;
attributes.height = WindowManager.LayoutParams.WRAP_CONTENT;
attributes.gravity = Gravity.CENTER;
window.setAttributes(attributes);

效果如下:
在这里插入图片描述

带半径的对话框(自定义)

每个人开发带半径的对话框时应该都会遇到这样的一个问题,设置了半径却不显示效果,而这样的情况我已经试过两三次了,每次都靠网友的答案才能帮我度过此劫,做一个半径的对话框记录下来,再遇到这种问题就无需到处跑去找原因啦。
1、在layout创建一个dialog_radius.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:layout_gravity="center"
    android:background="@drawable/background_radius">

    <TextView
        android:layout_width="333dp"
        android:layout_height="320dp"
        android:gravity="center"
        android:text="有半径的对话框"
        android:textSize="25sp" />
</LinearLayout>

2、在drawable文件夹下创建一个background_radius.xml文件,作为对话框的背景。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="20dp"/>
    <solid android:color="@color/white"/>
</shape>

3、在代码中设置好参数后,show()一下就是一个对话框。

// 创建一个AlertDialog并设置View布局文件
val dialog: AlertDialog = AlertDialog.Builder(this).setView(R.layout.dialog_radius).create()
dialog.show()

但这个时候并未完成全部工作,这时候运行起来的对话框必定是没有半径的对话框,相当于我们设置的半径并未生效。原因在于AlertDialog是有它自己的一个背景,需要将AlertDialog的背景隐藏掉,才能正常显示出设置好的半径对话框。

// 设置对话框显示的位置
dialog.window!!.setGravity(Gravity.CENTER);
// 将背景设置为透明
dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT));

在dialog_radius.xml布局中修改宽度、高度设置为match_parentwrap_content是不会对对话框的宽度、高度产生变化,宽度的设置唯有使用如下方法设置宽度。高度的设置只能是指定的dp,且不能是父布局设置宽高,高度只会随着子布局的高度增大而增大,当然对话框高度的设置也可使用以下方式。

// 在xml设置的宽度、高度不起作用时,可使用如下方法设置宽高
// setLayout(int width, int height)设置的宽高默认为px单位,如需适配其它屏幕需要转换
dialog.window!!.setLayout(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

效果如下:
在这里插入图片描述

AlertDialog其它常用属性

use methods Describe
setIcon(Drawable icon) 设置Drawable在标题中使用
setCancelable(boolean cancelable) 设置对话框是否可取消
setCustomTitle(View customTitleView) 使用自定义视图设置标题customTitleView
setAdapter(ListAdapter adapter, DialogInterface.OnClickListener listener) 设置由 given 提供的项目列表,ListAdapter作为内容显示在对话框中,您将通过提供的侦听器收到所选项目的通知

日期时间系列

日期时间系列对话框,用到了两个类,分别是TimePickerDialogDatePickerDialog,这两个对话框样式不多,它们只做自己专业的事,例如使用TimePickerDialog,你只能做一个时间选择的对话框,无法类似AlertDialog做到一个class多种样式。同时,TimePickerDialogDatePickerDialog的父类都是AlertDialog,这也就使得AlertDialog的公共方法这两个对话框都可以使用。

时间选择器

TimePickerDialog

TimePickerDialog类的方法不多,直接写构造方法 + show(),效果就出来了。

TimePickerDialog(this,{ timePicker: TimePicker?, hourOfDay: Int, minute: Int -> 
		show("选中了" + hourOfDay + "时" + minute + "分") 
	},0,0,true).show()

在这里插入图片描述

TimePickerDialog属性
Public constructors Describe
TimePickerDialog(Context context, TimePickerDialog.OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView) 创建一个新的时间选择器对话框
TimePickerDialog(Context context, int themeResId, TimePickerDialog.OnTimeSetListener listener, int hourOfDay, int minute, boolean is24HourView) 创建具有指定主题的新时间选择器对话框
Public methods Describe
onClick(DialogInterface dialog, int which) 单击对话框中的按钮时将调用此方法
onRestoreInstanceState(Bundle savedInstanceState) 从以前保存的包中恢复对话框的状态
onSaveInstanceState() 将对话框的状态保存到包中
updateTime(int hourOfDay, int minuteOfHour) 设置当前时间
show() 启动对话框并将其显示在屏幕上

日期选择器

DatePickerDialog

DatePickerDialogTimePickerDialog类一样,直接写构造方法 + show(),效果就出来了。

DatePickerDialog(this,{ datePicker: DatePicker?, year: Int, month: Int, dayOfMonth: Int -> 
		show("选中了" + year + "年" + month + "月" + dayOfMonth + "日") 
	},2022,5,25).show()

在这里插入图片描述

DatePickerDialog属性
Public constructors Describe
DatePickerDialog(context: Context) 使用父上下文的默认日期选择器对话框主题为当前日期创建一个新的日期选择器对话框
DatePickerDialog(context: Context, themeResId: Int) 为当前日期创建一个新的日期选择器对话框
DatePickerDialog(context: Context, listener: DatePickerDialog.OnDateSetListener?, year: Int, month: Int, dayOfMonth: Int) 使用父上下文的默认日期选择器对话框主题为指定日期创建一个新的日期选择器对话框
DatePickerDialog(context: Context, themeResId: Int, listener: DatePickerDialog.OnDateSetListener?, year: Int, monthOfYear: Int, dayOfMonth: Int) 为指定日期创建一个新的日期选择器对话框
Public methods Describe
onClick(dialog: DialogInterface, which: Int) 单击对话框中的按钮时将调用此方法
onDateChanged(view: DatePicker, year: Int, month: Int, dayOfMonth: Int) 要求更改日期
setOnDateSetListener(listener: DatePickerDialog.OnDateSetListener?) 设置在用户设置日期时调用的侦听器
updateDate(year: Int, month: Int, dayOfMonth: Int) 设置当前日期

进度条系列(ProgressDialog)

进度条对话框在低版本的Android系统可直接使用ProgressDialog展示,这样简单又快捷。

val progressDialog = ProgressDialog(this)
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL)
progressDialog.setTitle("正在下载...")
progressDialog.progress = 50
progressDialog.show()

可惜的是,在 Android 8 及以上的系统中,该类已被废弃。

在这里插入图片描述

要想实现类似效果,我们也只能自定义了。
ProgressDialog类的直接父类是AlertDialog,使用AlertDialog实现水平进度条对话框应该是最简单的方式。步骤如下:

1、定义一个xml布局,在布局里使用ProgressBar充当ProgressDialog的水平进度条。

<androidx.constraintlayout.widget.ConstraintLayout 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"
    android:paddingBottom="10dp"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="25dp"
        android:layout_marginRight="25dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"/>

    <TextView
        android:id="@+id/percentage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/progressBar"
        app:layout_constraintRight_toRightOf="parent"
        android:text="0%"
        android:layout_marginRight="25dp"/>

</androidx.constraintlayout.widget.ConstraintLayout>

2、使用AlertDialog.BuildersetView(View view)方法将编写好的xml塞入到AlertDialog.Builder里面。

val alertDialog = AlertDialog.Builder(this)
alertDialog.setTitle("水平进度条对话框")
val inflate = LayoutInflater.from(this).inflate(R.layout.progress_bar, null)
(inflate.findViewById(R.id.progressBar) as ProgressBar).progress = 50
(inflate.findViewById(R.id.percentage) as TextView).text = "50%"
alertDialog.setView(inflate)
alertDialog.show()

效果如下:

2.png


点击下载源码

参考文档:Android developers

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Android】常用对话框大全(一)Android Dialog 的相关文章

随机推荐

  • 「总结」最全2万字长文解读7大方向人脸数据集v2.0版

    人脸图像是计算机视觉领域中研究历史最久 也是应用最广泛的图像 从人脸检测 人脸识别 人脸的年龄表情等属性识别 到人脸的三维重建等 都有非常多的数据集被不断整理提出 极大地促进了该领域的发展 本次 我们从人脸检测 关键点检测 人脸识别 人脸属
  • 【多模态】22、UniDetector

    文章目录 一 背景 二 方法 2 1 UniDetector 框架结构 2 2 Heterogeneous Label Space Training 2 3 open world inference 三 效果 3 1 数据集 3 2 Obj
  • cmake:target属性POSITION_INDEPENDENT_CODE和INTERFACE_POSITION_INDEPENDENT_CODE的区别

    cmake定义的target有两个名字类似的属性 POSITION INDEPENDENT CODE和INTERFACE POSITION INDEPENDENT CODE 本文说明它们的含义和区别 fPIC 介绍POSITION INDE
  • linux ALSA & ASOC (3) — widget 、route

    目录 DAPM的基本单元widget widget的种类 widget之间的连接器path widget的连接关系route 上一篇文章中 我们介绍了音频驱动中对基本控制单元的封装 kcontrol 利用kcontrol 我们可以完成对音频
  • 退出旋流虚空

    在构建一些软件之前 您经常面临着各种可能性的漩涡 这可能导致 期权瘫痪 想象一个巨大的系统 建立框架的错误愿望 付出了很多努力 但没有进展或结果 作为一个明智的领袖曾经对我说 出色的软件开发人员的特点是他们能够解决一个大问题并将其分解为较小
  • word文件丢失怎么办?恢复Word文档的3个方案

    电脑里面有很多大大小小的文件数据 有时对我们可有可无 有时是很重要的 在清理电脑过程中 要是不小心误删了重要的文件 word文件丢失如何恢复 只需要下面的3个方案 就可以轻松找回Word文档 方案一 回收站恢复Word文档 要说电脑最容易误
  • Nginx快速入门

    Nginx服务快速入门 文章目录 Nginx服务快速入门 一 Nginx介绍 1 什么是Nginx 2 为什么要使用Nginx 3 什么是正向代理 4 什么是反向代理 二 Nginx在Linux下的安装 1 下载 2 安装 三 Nginx配
  • 用批处理将文件夹设为虚拟磁盘

    记录备忘 将下列文本保存成 bat subst Z d subst Z D WorkSpace
  • python 爬虫 requests模块 中的Cookies 验证 通过验证cookies模拟登陆豆瓣登陆

    在爬取某些数据时 需要进行网页的登陆 才可以进行数据的抓取工作 Cookies登陆就像很多网页中的自动登陆功能一样 可以让用户第二次登陆时不在需要验证账号和密码的情况下进行登陆 在requests模块中实现Cookies登陆时 首先需要在浏
  • 华为OD机试真题 Java 实现【异常的打卡记录】【2023Q1 100分】

    一 题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据 也是计算职工工资的原始依据 为了正确地计算职工工资和监督工资基金使用情况 公司决定对员工的收集打卡记录进行异常排查 如果出现以下两种情况 则认为打卡异常 实际设备号与注册设备
  • selenium+pytest——失败用例重试

    selenium pytest 失败用例重试 一 目的 在我们使用selenium pytest做UI自动化的时候偶尔会遇到因为特殊情况 比如浏览器加载失败 网络波动等等导致用例运行失败 可能单独运行没 问题 对于这些场景产生的用例结果不是
  • UE4 蓝图通信:接口调用

    UE4学习心得 蓝图间信息通信的几种方法 UE4的接口调用技术有点简单粗暴 而且主要体现在主蓝图对子蓝图的信息通信 在内容浏览器中添加一个蓝图接口 命名为TestInterface 双击打开接口 直接使用其创建时自带的一个接口函数 将其重命
  • 物理机安装centos7(u盘安装)——详细版

    我用的是华为的物理机 其它物理机操作几乎相同 可能不同的设置调试方法不同 如果是虚拟机安装 直接跳到centos7设置即可 物理机U盘启动 安装centos8方法相同 可能有些需要硬件配置相关 相关问题看具体报错方式 UltraISO下载地
  • 在C语言中 ¬∧∨这些符号什么意思

    b b b a a a b a a 或运算是 a b a b b b a a a 这三个都是位运算 是取非运算 交你个小窍门 没啥子好多的了 好好看看 里面有详细的解释 这就是在逻辑运算中常用到的短路判断 ls的已经说的很清楚了 b a b
  • 微信小程序之首页搭建

    小程序开发与实战 学习视频 https www bilibili com video BV1Gv411g7j6 p 9 spm id from pageDriver 实现导航栏和tabBar 实现导航栏和tabBar tabBar看下图 参
  • 电荷泵

    电荷泵 又称为电容式的开关稳压器 或开关电容DC DC变换器 无感式DC DC变换器 电荷泵采用电容作为开关和储能的元件 如图所示 S1与S3闭合 S2与S4断开 则Vin给电容充电 而后S1与S3断开 S2与S4闭合 则电容放电 此时Vo
  • Virtual Judge-4099:队列和栈

    Virtual Judge 4099 队列和栈 题目描述 队列和栈是两种重要的数据结构 它们具有push k和pop操作 push k是将数字k加入到队列或栈中 pop则是从队列和栈取一个数出来 队列和栈的区别在于取数的位置是不同的 队列是
  • PyTorch入门(六)使用Transformer模型进行中文文本分类

    在文章PyTorch入门 五 使用CNN模型进行中文文本分类中 笔者介绍了如何在PyTorch中使用CNN模型进行中文文本分类 本文将会使用Transformer模型实现中文文本分类 本文将会使用相同的数据集 文本预处理已经在文章PyTor
  • C语言程序——用星号打印图案

    文章目录 前言 一 用星号打印图案 二 程序实例 1 程序代码 2 运行结果 3 结果分析 三 拓展应用 总结 前言 用打印字符来输出星号组成的HELLO 一 用星号打印图案 用星号打印图案 一般利用星号画出具体的模拟输出形式 然后在输出时
  • 【Android】常用对话框大全(一)Android Dialog

    Android的对话框有多少种 Android好看的对话框有很多 如Android material qmui xui kongzue等系列对话框 但博主只打算讲解Android material系列对话框 讲太多没必要 实在想要做成人家那