Android常用对话框使用大全
发布时间 - 2026-01-10 21:55:48 点击率:次日常生活中我们随处可见对话框,上面有很多提示信息,更加方便提示用户进行不同的操作。

一、对话框的两个特点和一些常见的对话框
1.当弹出对话框是会结束UI线程(即主线程);
2.当前的Activity会失去焦点;
3.消息对话框、确认对话框、列表对话框、单选和多选对话框、自定义对话框
二、对话框的组成(一般有四部分组成)
1.图标
2.标题
3.内容
4.按钮
三、那么如何创建一个对话框呢?(四步组成)
1.第一步创建AlertDialog.Builder对象(建造者模式)
2.第二步设置图标、标题、内容和按钮等区域
3.第三步调用create()方法来创建(一般自动调用)
4.第四步调用show()方法来显示
四、点击跳转界面和长按弹出对话框的业务逻辑
1.接着上面的学的ListView来实现常见的操作,在日常生活中,我们经常聊qq,在聊天列表中,但我们点击某一行时,会进入聊天界面,当我们长按某一行时,会弹出置顶和删除小提示。
2.MainActivity.java代码如下
package com.oldtogether.adapterdemo2;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class MainActivity4 extends ActionBarActivity implements OnItemClickListener, OnItemLongClickListener {
// 创建数组,采用for循环进行遍历
private int[] imageIds = new int[] { R.drawable.daxiang, R.drawable.maozi, R.drawable.nangua, R.drawable.nanguobq,
R.drawable.tiaopi, R.drawable.xiaolian, R.drawable.xin, R.drawable.weixin, R.drawable.hongx,
R.drawable.xm };
private String[] titles = new String[] { "卖萌大象", "圣诞帽子", "愤怒南瓜", "难过表情", "调皮表情", "我倩的笑脸表情", "oldtogether爱心", "微信",
"粉色少女心", "一代撸" };
private String[] versions = new String[] { "版本:1.10", "版本:2.10", "版本:1.11", "版本:2.12", "版本:3.10", "版本:2.20",
"版本:5.20", "版本:1.23", "版本:2.21", "版本:2.40", };
private String[] sizes = new String[] { "大小:32.01M", "大小:32.02M", "大小:23.01M", "大小:11.01M", "大小:41.01M",
"大小:11.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
// 1、过的ListView对象
ListView lv = (ListView) findViewById(R.id.lv_play);
// 2、数据源
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < titles.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("logo", imageIds[i]);
map.put("title", titles[i]);
map.put("version", versions[i]);
map.put("size", sizes[i]);
list.add(map);
}
// 3、设置适配器
MyAdapter3 adapter3 = new MyAdapter3(this);
adapter3.setList(list);// 传入数据
// 4、关联适配器
lv.setAdapter(adapter3);
// 5、为ListView设置事件监听器(一下两个常用事件),让主MainActivity2实现接口,并重写方法
lv.setOnItemClickListener(this);
lv.setOnItemLongClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
/* 创建了一个意图对象,调用setClass方法表明“在那个Activity中调用那个Activity”次意图*/
Intent intent = new Intent();
intent.setClass(getApplicationContext(), DetailActivity.class);
//获得点击行的数据
HashMap <String,Object> itemMap= (HashMap<String,Object>) parent.getItemAtPosition(position);
intent.putExtra("index", ""+position);//获得编号
intent.putExtra("title", ""+itemMap.get("title"));//获得标题
startActivity(intent);
}
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("消息提示");
builder.setMessage("这是一个简单的标题");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//点击对话框中的确定按钮会出现一个Toast提示框
Toast.makeText(MainActivity4.this, "点击了确定", Toast.LENGTH_LONG).show();
}
});
builder.create().show();
return true;
/*
* 返回值代表了事件的消化 1、true:表示消化掉事件,事件不会继续传递 2、false:表示不消化事件,事件继续传递
* 结论:如果希望长按事件后,不在出现点击事件,则应将返回值设置为true
*/
}
}
3.代码简洁之“连点”
1).通过创建者模式获得Builder对象,然后通过连点方式调用其方法可使代码简化;
2).连点使用的原则是,所调用的方法返回值是当前对象本身;
3).下面是通过连点在长按方法中实现此相同功能的代码。
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
new AlertDialog.Builder(this)
.setIcon(R.drawable.ic_launcher)
.setTitle("消息提示")
.setMessage("这是一个简单的标题")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity4.this, "点击了确定", Toast.LENGTH_LONG).show();
}
})
.show();
return true;
}
4.运行结果
五、上面是消息对话框的实现,再次紧接着学习确认对话框
1.随处可见的确认对话框,用途:经常用于一些征求用户决定的操作,比如退出数据、删除数据、确认支付等。
2.直接贴代码
package com.oldtogether.adapterdemo2;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class MainActivity4 extends ActionBarActivity implements OnItemClickListener, OnItemLongClickListener {
// 创建数组,采用for循环进行遍历
private int[] imageIds = new int[] { R.drawable.daxiang, R.drawable.maozi, R.drawable.nangua, R.drawable.nanguobq,
R.drawable.tiaopi, R.drawable.xiaolian, R.drawable.xin, R.drawable.weixin, R.drawable.hongx,
R.drawable.xm };
private String[] titles = new String[] { "卖萌大象", "圣诞帽子", "愤怒南瓜", "难过表情", "调皮表情", "我倩的笑脸表情", "oldtogether爱心", "微信",
"粉色少女心", "一代撸" };
private String[] versions = new String[] { "版本:1.10", "版本:2.10", "版本:1.11", "版本:2.12", "版本:3.10", "版本:2.20",
"版本:5.20", "版本:1.23", "版本:2.21", "版本:2.40", };
private String[] sizes = new String[] { "大小:32.01M", "大小:32.02M", "大小:23.01M", "大小:11.01M", "大小:41.01M",
"大小:11.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
// 1、过的ListView对象
ListView lv = (ListView) findViewById(R.id.lv_play);
// 2、数据源
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < titles.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("logo", imageIds[i]);
map.put("title", titles[i]);
map.put("version", versions[i]);
map.put("size", sizes[i]);
list.add(map);
}
// 3、设置适配器
MyAdapter3 adapter3 = new MyAdapter3(this);
adapter3.setList(list);// 传入数据
// 4、关联适配器
lv.setAdapter(adapter3);
// 5、为ListView设置事件监听器(一下两个常用事件),让主MainActivity2实现接口,并重写方法
lv.setOnItemClickListener(this);
lv.setOnItemLongClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
/* 创建了一个意图对象,调用setClass方法表明“在那个Activity中调用那个Activity”次意图*/
Intent intent = new Intent();
intent.setClass(getApplicationContext(), DetailActivity.class);
//获得点击行的数据
HashMap <String,Object> itemMap= (HashMap<String,Object>) parent.getItemAtPosition(position);
intent.putExtra("index", ""+position);//获得编号
intent.putExtra("title", ""+itemMap.get("title"));//获得标题
startActivity(intent);
}
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
//长按之确定对话框
new AlertDialog.Builder(this)
.setIcon(R.drawable.ic_launcher)
.setTitle("你确定要退出吗?")
.setNegativeButton("取消", null)//null,说明不进行自定义的任何操作,只是单纯的关闭当前对话框,又停在原界面
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();//关闭当前Activity
}
})
.show();
return true;
}
}
3.运行结果
4.补充:当点击取消是会停留在当前Activity;当点击确定会退出当前Activity,返回到模拟器主界面。
六、列表对话框
1.用途:以列表的形式展示数据、列表项可点击、需要一个数组资源作为数据源。
2.核心方法:setItems();在准备一个数组资源;
3.代码如下:
package com.oldtogether.adapterdemo2;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnLongClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class MainActivity4 extends ActionBarActivity implements OnItemClickListener, OnItemLongClickListener {
// 创建数组,采用for循环进行遍历
private int[] imageIds = new int[] { R.drawable.daxiang, R.drawable.maozi, R.drawable.nangua, R.drawable.nanguobq,
R.drawable.tiaopi, R.drawable.xiaolian, R.drawable.xin, R.drawable.weixin, R.drawable.hongx,
R.drawable.xm };
private String[] titles = new String[] { "卖萌大象", "圣诞帽子", "愤怒南瓜", "难过表情", "调皮表情", "我倩的笑脸表情", "oldtogether爱心", "微信",
"粉色少女心", "一代撸" };
private String[] versions = new String[] { "版本:1.10", "版本:2.10", "版本:1.11", "版本:2.12", "版本:3.10", "版本:2.20",
"版本:5.20", "版本:1.23", "版本:2.21", "版本:2.40", };
private String[] sizes = new String[] { "大小:32.01M", "大小:32.02M", "大小:23.01M", "大小:11.01M", "大小:41.01M",
"大小:11.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", "大小:33.01M", };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
// 1、过的ListView对象
ListView lv = (ListView) findViewById(R.id.lv_play);
// 2、数据源
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < titles.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("logo", imageIds[i]);
map.put("title", titles[i]);
map.put("version", versions[i]);
map.put("size", sizes[i]);
list.add(map);
}
// 3、设置适配器
MyAdapter3 adapter3 = new MyAdapter3(this);
adapter3.setList(list);// 传入数据
// 4、关联适配器
lv.setAdapter(adapter3);
// 5、为ListView设置事件监听器(一下两个常用事件),让主MainActivity2实现接口,并重写方法
lv.setOnItemClickListener(this);
lv.setOnItemLongClickListener(this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
/* 创建了一个意图对象,调用setClass方法表明“在那个Activity中调用那个Activity”次意图*/
Intent intent = new Intent();
intent.setClass(getApplicationContext(), DetailActivity.class);
//获得点击行的数据
HashMap <String,Object> itemMap= (HashMap<String,Object>) parent.getItemAtPosition(position);
intent.putExtra("index", ""+position);//获得编号
intent.putExtra("title", ""+itemMap.get("title"));//获得标题
startActivity(intent);
}
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
//列表对话框
final String [] sites={"打印店","男生公寓","女生公寓","清真食堂","大众食堂","图书馆","洗浴中心"};//设置为final(常量)的原因是可以穿透作用域
new AlertDialog.Builder(this)
.setTitle("兰州城市学院培黎校区")
.setItems(sites, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//参数 which代表了消息对话框中的第几项
Toast.makeText(MainActivity4.this, "您选择了"+sites[which], Toast.LENGTH_LONG).show();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//关闭的对话框的第二种方式,重写一个没有任何逻辑的空方法
}
})
.show();
return true;
}
}
4.运行结果
七、单选对话框
1.单选对话框,用途:需要用户进行单行选择是进行使用;核心方法:setSingleChoiceItems();
2.实现步骤
1).准备一个数组资源(一般设置为常量数组,为了方便穿透作用域);
2).调用setSingleChioceItems()设置单选列表项。
3.代码实现(直接在onItemLongClick写Dialog相关代码,其他代码一样)
//在主类中的全局变量1、暂存用户所选的评分级别;(另外如果将此变量初始值设为0,直接点击确定会出现1星评分,有bug)2、方便穿透作用域;
int selectedId = -1;
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
//长按之单选对话框
final String [] stars={"1星","2星","2星","3星","4星","5星"};//设置为final(常量)的原因是可以穿透作用域
new AlertDialog.Builder(this)
.setTitle("大胸弟,来个5星的评分吧!")
.setSingleChoiceItems(stars, -1, new DialogInterface.OnClickListener() {
/*
* 第一个参数:所要显示的资源数组;
* 第二个参数:在单选对话框列表中默认情况先所选择的行标(这里设置为-1的原因是数组默认情况先下标从0开始,如果将此参设置为0,跳出单选对话框时默认情况下会为1星评分,有bug);
* 第三个参数:点击某行事件,自定义业务逻辑代码(这里只用简单的Toast来实现);
* 补充:dialog.dismiss()让对话框消失。
*/
@Override
public void onClick(DialogInterface dialog, int which) {
selectedId = which;//在用户单选时起到一个暂存的作用,方便确定是被引用
Toast.makeText(MainActivity4.this, "您当前选择了:"+stars[which], Toast.LENGTH_LONG).show();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity4.this, "您最终的决定是:"+stars[selectedId], Toast.LENGTH_LONG).show();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//空操作的方法
}
})
.show();
return true;
}
4.运行结果
八、多选对话框
1.多选对话框。用途:提供用户进行多项选择;核心方法setMultiChoiceItems();(multi:英语中多的意思)
2.实现步骤
1).准备一个数组资源;
2).调用setMultiChoiceItems()方法设置多选项列表;
3.代码的实现(同理直接贴onItemLongClick()方法代码)
ArrayList<Integer> choice = new ArrayList<>();//创建一个ArrayList用来保存在Dialog中所选择的选项,同理设置为全局变量为了穿透作用域
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
//长按之多选框对话框
final String [] interests={"看书","打篮球","大lol","听音乐","看电影","跑步"};//设置为final(常量)的原因是可以穿透作用域
new AlertDialog.Builder(this)
.setIcon(R.drawable.ic_launcher)
.setTitle("你的爱好是什么?")
/*
* setMultiChoiceItems()方法中的三个参数
* 第一个参数:资源数组;
* 第二个参数:默认情况下的初始值,这里因为是多选,所以设置为boolean类型的数组;
* 第三个参数:多选框的点击事件;
*
*/
.setMultiChoiceItems(interests,
new boolean []{false,false,false,false,false,false},
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
/*
* 第一个参数:dialog对象;
* 第二个参数:多选对话框中用户所选中的项;
* 第三个参数:是否选中,true为选中,false为没有选中
*
*/
//选中则添加,后悔是时还可以remove掉
if(isChecked){
choice.add(which);
}else{
choice.remove(which);
}
Toast.makeText(MainActivity4.this, "您当前的选择是:"+choice.toString(), Toast.LENGTH_LONG).show();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity4.this, "您最终的决定是:"+choice.toString(), Toast.LENGTH_LONG).show();
}
})
.setNegativeButton("取消", null)
.show();
return true;
}
}
4.运行结果
九、心得总结
1.提到对话框可以直接脑补出对话款的组成,和创建对话框的步骤;
2.在单选对话框中设置默认初始值时,“-1”的巧用,关键点是数组下标从0开始,容易出现bug;
3.关闭对话框的两种方法(在点击负面按钮时)。第一种:在次方法中的第二个参数添加一个重操作即没有任何逻辑代码点击事件即可;第二种:直接将第二个参数设置为null;
4.两次经典的穿透作用域(附带魔法和物理伤害)。第一次在定义数据资源的时候,将数组资源用final修饰,让其为常量,方便在其他方法中调用,即穿透作用域;第二次在创建单选和多选对话框时,setSingleChioceItems()和setMultiChoiceItems()方法中有时候用户可能会修改第一次的选择,而将次选择暂存在一个最外层类的成员变量中(这里的int selectedId和泛型ArrayList对象),方便在点击确定按钮即调用onClick方法是被利用,同样再次穿透了作用域;
5.总之,日常生活中常见各种对话框,合理利用对话框会更好的实现界面与用户之间的交流。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# 对话框
# Android中自定义对话框(Dialog)的实例代码
# Android实现点击AlertDialog上按钮时不关闭对话框的方法
# android 对话框弹出位置和透明度的设置具体实现方法
# Android加载对话框同时异步执行实现方法
# Android修改源码解决Alertdialog触摸对话框边缘消失的问题
# Android中 动态改变对话框值的方法
# Android中创建一个透明的进度对话框实例
# 实例详解Android自定义ProgressDialog进度条对话框的实现
# android底部弹出iOS7风格对话选项框(QQ对话框)--第三方开源之IOS_Dialog_Li
# Android中AlertDialog各种对话框的用法实例详解
# 设置为
# 单选
# 多选
# 第二个
# 重写
# 第一个
# 遍历
# 弹出
# 自定义
# 第三个
# 连点
# 没有任何
# 对话框中
# 返回值
# 这是一个
# 将此
# 随处可见
# 来实现
# 方法来
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Java类加载基本过程详细介绍
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
大学网站设计制作软件有哪些,如何将网站制作成自己app?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
js代码实现下拉菜单【推荐】
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
如何用西部建站助手快速创建专业网站?
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Laravel如何创建自定义Artisan命令?(代码示例)
微信小程序 scroll-view组件实现列表页实例代码
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
Android自定义listview布局实现上拉加载下拉刷新功能
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
如何选择PHP开源工具快速搭建网站?
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
jQuery validate插件功能与用法详解
网站优化排名时,需要考虑哪些问题呢?
如何快速查询域名建站关键信息?
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
Laravel怎么使用artisan命令缓存配置和视图
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
三星网站视频制作教程下载,三星w23网页如何全屏?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何快速搭建高效WAP手机网站吸引移动用户?
如何在云虚拟主机上快速搭建个人网站?
Laravel如何自定义错误页面(404, 500)?(代码示例)
Laravel如何处理异常和错误?(Handler示例)
iOS发送验证码倒计时应用
音响网站制作视频教程,隆霸音响官方网站?
如何快速生成ASP一键建站模板并优化安全性?
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
什么是javascript作用域_全局和局部作用域有什么区别?
手机网站制作与建设方案,手机网站如何建设?
java获取注册ip实例
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
如何用wdcp快速搭建高效网站?
Laravel如何处理CORS跨域请求?(配置示例)
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
🚀拖拽式CMS建站能否实现高效与个性化并存?
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】

