Android 对话框(Dialog)

article/2025/10/29 9:17:52

对话框是提示用户做出决定或输入额外事件的小窗口。对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件。

Dialog类是对话框的基类,我们可以使用Dialog来构建一个对话框。但Android建议避免直接使用Dialog,而应该使用其子类。下面是一些Dialog的子类实现:

AlertDialog一个可以显示标题,可选项列表或自定义布局,最多还可以显示三个按钮的对话框。
DatePickerDialog或TimerPickerDialog一个带有允许用户选择日期或时间的预定义UI的对话框。

构建一个简单的提醒对话框

AlertDialog.Builder(this).apply {setTitle("我是标题")setMessage("我是内容")setPositiveButton("确认") { dialog, _ ->//点击了确认按钮dialog.dissmiss()}setNegativeButton("取消") { dialog, _ ->//点击了取消按钮dialog.dismiss()}create()show()
}

上面的对话框包括三个区域:   

1.标题区域,这是一个可选项,只应在内容区域被详细消息,列表,或自定义布局占据时使用。如果显示的是一条简单的消息或问题,则不需要标题。
2.内容区域,它可以显示消息,列表,或其他自定义的布局。
3.操作按钮,一个对话框中最多只允许存在三个操作按钮。

构建一个单选列表对话框

val colors = arrayOf("黄色", "红色", "绿色")
AlertDialog.Builder(this).apply {setTitle("选择颜色")setItems(colors) { _, which ->//which 选择项的索引位置}create()show()
}

使用setItems()方法创建一个包含标题和列表的对话框,默认状态下,触摸列表会清除对话框。

构建永久性的单选多选对话啊框

上面的单选对话框默认在触摸列表后清除,要想添加永久性的单选或多选可以分别使用setSingleChoiceItems()或setMultiChoiceItems()方法。setSingleChoiceItems()方法中的第二个参数表示表示默认选中,如果不希望默认选中可传入-1。

val colors = arrayOf("Red", "Green", "Blue")
AlertDialog.Builder(this).apply {setTitle("选择颜色")setSingleChoiceItems(colors, -1) { _, which ->//每次选中一个选项时都会调用该方法//which 选择项的索引位置}setPositiveButton("确定") { dialog, _ ->//点击了确认按钮dialog.dismiss()}setNegativeButton("取消") { dialog, _ ->//点击了取消按钮dialog.dismiss()}create()show()
}

val selectedColors = ArrayList<String>()
val colors = arrayOf("Red", "Green", "Blue")
AlertDialog.Builder(this).apply {setTitle("选择颜色")setMultiChoiceItems(colors, null) { _, which, isChecked ->if (isChecked) {selectedColors.add(colors[which])} else if (selectedColors.contains(colors[which])) {selectedColors.remove(colors[which])}}setPositiveButton("确定") { dialog, _ ->//点击了确认按钮dialog.dismiss()}setNegativeButton("取消") { dialog, _ ->//点击了取消按钮dialog.dismiss()}create()show()
}

构建自定义布局的对话框

构建自定义布局的对话框需要创建一个布局,在调用setView()将其添加到AlertDialog。

res/layout./dialog_signin.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="wrap_content"android:layout_height="wrap_content"><ImageViewandroid:src="@drawable/ic_launcher"android:layout_width="match_parent"android:layout_height="64dp"android:scaleType="center"android:background="#FFFFBB33"android:contentDescription="@string/app_name" /><EditTextandroid:id="@+id/username"android:inputType="textEmailAddress"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="16dp"android:layout_marginLeft="4dp"android:layout_marginRight="4dp"android:layout_marginBottom="4dp"android:hint="username" /><EditTextandroid:id="@+id/password"android:inputType="textPassword"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="4dp"android:layout_marginLeft="4dp"android:layout_marginRight="4dp"android:layout_marginBottom="16dp"android:fontFamily="sans-serif"android:hint="password"/></LinearLayout>
val view = layoutInflater.inflate(R.layout.dialog_signin, null)
val etUserName = view.findViewById<View>(R.id.username) as EditText
val etPassword = view.findViewById<View>(R.id.password) as EditText
AlertDialog.Builder(this).apply {setView(view)setPositiveButton("确定") { dialog, _ ->val userName = etUserName.text.toString()val passWord = etPassword.text.toString()//点击了确认按钮dialog.dismiss()}setNegativeButton("取消") { dialog, _ ->//点击了取消按钮dialog.dismiss()}create()show()
}

使用DialogFragment

DialogFragment是Android3.0添加的。谷歌建议应该将DialogFragment用于对话框的容器。DialogFragment提供了创建对话框和管理器外观所需的所有控件,而不用去调用Dialog对象上的方法。使用DialogFragment能正确处理其生命周期的事件。如屏幕旋转。

DialogFragment的使用也很简单,只需继承DialogFragment并实现onCreateDialog()方法。

class MyDialogFragment : DialogFragment() {override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {AlertDialog.Builder(requireActivity()).apply {setMessage("我的DialogFragment")setPositiveButton("确定") { dialog, _ ->dialog.dismiss()}setNegativeButton("取消") { dialog, _ ->dialog.dismiss()}return create()}}
}

然后获取此类的实例并调用show()方法,并传递一个FragmentManager和一个标记名称,该名称是系统在必要时用于恢复该片段的唯一标志。

如何与宿主Activity通信

我们在使用DialogFragment时,通常会与宿主Activity或Fragment分开创建。这时,当我们点击了dialog上的按钮时,DialogFragment可能会自行执行必要操作,但通常需要把事件传递给打开该对话框的Activity或Fragment。我们可以在DialogFragment里面定义一个接口,其中每种类型的点击事件定义一个方法。(当然,你也可以只定义其中的一种)。在打开该对话框的Activity或Fragment实线该接口。

class MyDialogFragment : DialogFragment() {internal lateinit var listener: MyDialogListenerinterface NoticeDialogListener {fun onDialogPositiveClick(dialog: DialogFragment)}override fun onAttach(context: Context) {super.onAttach(context)try {listener = context as NoticeDialogListener} catch (e: ClassCastException) {throw ClassCastException((context.toString() +" must implement MyDialogListener"))}}
}

该调用cancel()还是dismiss()

这两个方法都可以用来清除对话框。系统会在用户触摸某个对话框列表项时清除对话框,但是使用单选按钮和复选按钮时除外,我们应该通过调用dismiss()方法手动清除对话框,如果需要在对话框消失时做一些特定的操作,可以在我们自己DialogFragment中实现onDismiss()方法。

取消对话框是一个特殊事件,它表示用户显示离开对话框,而不完成任务。如用户点击了返回按钮,触摸了对话框外面的区域,或者我们自己显示的调用了cancel()(例如响应对话框中的取消按钮),就会发生这种状况。

系统会在调用了onCancel()回调事件时立即调用onDismiss()。而调用dismiss(),系统会回调onDismiss()而不会调用onCancel()。因此,当用户在对话框中按确定按钮时,应该调用dismiss()方法清除对话框。

自定义对话框的位置和弹出动画

当我们需要一个从底部弹出的对话框时就可以自定义一个。我们继承一个DialogFragment,并重写它的onStart()方法。

override fun onStart() {super.onStart()val window = dialog.window//为window设置一个背景,如果不设置,dialog会与四周有一定的距离window?.setBackgroundDrawableResource(android.R.color.white)//设置window的弹出动画window?.setWindowAnimations(R.style.BottomDialogAnim)//设置window的位置,大小val params = window?.attributesparams?.gravity = Gravity.BOTTOMparams?.width = WindowManager.LayoutParams.MATCH_PARENTparams?.height = WindowManager.LayoutParams.WRAP_CONTENTwindow?.attributes = params
}

进入动画

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:fromYDelta="100%"android:toYDelta="0"android:duration="350">
</translate>

退出动画

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:fromYDelta="0"android:toYDelta="100%"android:duration="300">
</translate>

Style

<style name="BottomDialogAnim"><item name="android:windowEnterAnimation">@anim/dialog_fr_in</item><item name="android:windowExitAnimation">@anim/dialog_fr_out</item>
</style>


http://chatgpt.dhexx.cn/article/7vmi4PZq.shtml

相关文章

android十大常用对话框

Android十大常用对话框 一、对话框效果二、代码 最近老师叫我们整理android常用的对话框&#xff0c;我整理了十种对话框&#xff0c;用于分享交流&#xff0c;希望指正&#xff01; 一、对话框效果 主界面 1.普通对话框 2.单选对话框 3.多选对话框 4.列表对话框 5.不带进…

Android常用的几种对话框

1文本提示对话框 AlertDialog.Builder b new AlertDialog.Builder(this);//this为上下文&#xff0c;如果在本类里显示&#xff0c;通常使用this b.setTitle("标题");/对话框标题 b.setMessage("可能会删除某个文件");//提示文本 …

Android对话框的详细介绍(提示对话框,自定义对话框)

简介&#xff1a; 我们都知道在Android开发中&#xff0c;当我们的程序在与用户交互时&#xff0c;用户会得到一定的反馈&#xff0c;其中以对话框的形式的反馈还是比较常见的&#xff0c;接下来我们来介绍几种常见的对话框的基本使用。 前置准备&#xff1a;&#xff08;文章…

WinInet 和 WinHttp 有何区别?

背景 WinInet和WinHttp是windows平台下提供了两套独立的网络库&#xff0c;按照微软官方的说法&#xff0c; WinInet的优势在于client-端的应用&#xff0c;而WinHttp更适用于server-端编程。从名称上我们可以看出WinHttp在Http协议应用方面要比WinInet更加专业&#xff0c;Win…

使用WinHTTP与服务器通讯

WinHTTP 的工作流程如下 一.初始化WinHTTP 在与服务器交互之前, 必须用调用WinHttpOpen进行初始化,WinHttpOpen创建一个会话,并返回该会话的句柄,接着有了这个句柄, WinHttpConnect就能指定一个目标服务器 注意:调用了WinHttpConnect并不意味着和服务器建立了真正的连接 二.打…

使用c++ winhttp实现post请求

winhttp是windows网络库&#xff0c;要测试自己写的post请求是否有效&#xff0c;首先得在postman上面建立一个可用的接口。我的如下。 代码思路如下&#xff1a; 1、首先使用WinHttpCrackUrl拆解链接&#xff0c;后面会使用到拆解出来的信息。 2、再使用WinHttpOpen初始化 3、…

HTTP HTTPS POST GET(包含curl版本和winhttp两种实现)

玩过抓包&#xff0c;网络协议分析的朋友肯定都知道http https post get&#xff0c;web端和用户的交互主要是通过post get完成的。 今天带给大家的是C版本的http https get post,只会易语言的朋友请移步。 我这里有两种实现&#xff1a; 1&#xff1a;libcurl实现的CHttpClien…

C++用winhttp实现https访问服务器

由于项目升级&#xff0c;在数据传输过程中需要经过OAuth2.0认证&#xff0c;访问服务器需要https协议。 首先&#xff0c;实现C代码访问https 服务器&#xff0c;实现Get和post功能&#xff0c;在网上搜索一通&#xff0c;发现各种各样的都有&#xff0c;有的很简单&#xff0…

实现HTTP协议Get、Post和文件上传功能——使用WinHttp接口实现

在《使用WinHttp接口实现HTTP协议Get、Post和文件上传功能》一文中&#xff0c;我已经比较详细地讲解了如何使用WinHttp接口实现各种协议。在最近的代码梳理中&#xff0c;我觉得Post和文件上传模块可以得到简化&#xff0c;于是几乎重写了这两个功能的代码。因为Get、Post和文…

使用WinINet和WinHTTP实现Http访问

Http访问有两种方式&#xff0c;GET和POST&#xff0c;就编程来说GET方式相对简单点&#xff0c;它不用向服务器提交数据&#xff0c;在这个例程中我使用POST方式&#xff0c;提交数据value1与value2&#xff0c;并从服务器得到他们的和&#xff08;value1 value2&#xff09;…

WinHttp.WinHttpRequest.5.1

Set oHttp CreateObject ( " WinHttp.WinHttpRequest.5.1 " )oHttp.Option( 6 ) 0 禁止自动Redirect&#xff0c;最关键的 oHttp.SetTimeouts 9999999 , 9999999 , 9999999 , 9999999 设置超时&#xff5e;和ServerXMLHTTP组件一样 oHttp.Open " GET &q…

Tinyhttpd for Windows

TinyHTTPd forWindows 前言 TinyHTTPd是一个开源的简易学习型的HTTP服务器&#xff0c;项目主页在&#xff1a;http://tinyhttpd.sourceforge.net/&#xff0c;源代码下载&#xff1a;https://sourceforge.net/projects/tinyhttpd/&#xff0c;因为是学习型的代码,已经有好多年…

windows安装http测试服务

祝您身体健康&#xff0c;前程似锦&#xff0c;小弟期待文章对您有帮助&#xff0c;也期待您的打赏: 目录 1. 下载 HttpMockServer工具 2. windows10 安装jdk1.8 3. jdk按照上面配置完环境变量后打开cmd&#xff0c;运行 4. 准备测试的响应数据 text.txt,内容如下: 5. 会弹…

C++ winhttp 实现文件下载器

本篇内容讲述 C winHttp 实现下载器的简单 demo&#xff0c;使用了 WinHttpOpen、WinHttpConnect、WinHttpOpenRequest、WinHttpSendRequest、WinHttpReceiveResponse、WinHttpQueryDataAvailable、WinHttpReadData、WinHttpCloseHandle 等函数。 版权声明&#xff1a;本文为C…

WinHTTP教程

最近有些忙&#xff0c;也没更新BLOG&#xff0c;这几天在捣鼓一个小玩意要用到WinHTTP API&#xff0c;发现资料很少&#xff0c;而且大都是些MFC封装的例子&#xff0c;看得我是一个头几个大。就把自己关于WinHTTP的学习总结了一下&#xff0c;仅供参考&#xff0c;各人理解可…

WinHttp c++ 介绍及应用

一、HTTP协议介绍 http协议的底层协议是TCP协议。TCP协议是基于数据流的传输方式。其又叫做“超文本传输协议”&#xff0c;为什么呢&#xff0c;因为它是将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器&#xff0c;通过因特网传送万维网文档的数据传送协议。 1…

WinHTTP

记录WinHTTP学习过程 一、什么是WinHTTP&#xff1f; WinHTTP的全称是Microsoft Windows HTTP Services&#xff0c; 它提供给开发者一个HTTP客户端应用程序接口(API)&#xff0c;通过这种API借助HTTP协议给其他的HTTP服务器发送请求。 二、WinHTTP访问流程 如上图&#xff0c;…

Java递归算法计算5的阶乘

递归 package com.etime.test019; //计算5的阶乘&#xff1b; public class Test15 {public static void main(String[] args) {//调用test1方法&#xff0c;且只调用一次int i test1(5);System.out.println(i);}//定义一个int类型返回值的静态方法public static int test1(i…

Java算法递归与递推

Java算法----递归与递推 递推实现递推思想递归实现递归思想递归实现递推思想递推实现递归思想四种方法的特点思维拓展 问题&#xff1a;给你一个整数n&#xff0c;如果n是奇数&#xff0c;就进行运算nn*31&#xff0c;如果n是偶数&#xff0c;就进行运算nn/2&#xff0c;直到n等…

Java开发 | 数据结构和算法之——递归算法

著名的Pascal之父——Nicklaus Wirth(沃斯)让他获得图灵奖的一句话就是他提出的著名公式:“程序=数据结构+算法”,这个公式对计算机科学的影响类似于爱因斯坦的质能方程在物理界的影响。 因此可以看出来数据结构和算法在我们开发程序中有多么的重要了,下面我们来简单认识…