安卓dialog的使用+如何自定义dialog

article/2025/11/6 6:03:13

吐槽

哇哇哇,刚写一半win10给我蓝屏了,心塞塞,以后写一点保存一点。回到正题,看到产品给我的设计图,有辣么多的自定义的dialog,发现之前自己只会系统自带的dialog,但是这样根本满足不了产品的需求,所以自己上周好好总结下,然后把产品给的需求完成。//哇哇哇,项目写不完了

什么叫dialog

简单来说就是一句话:
弹出一个窗口,提示用户自己去选择,去提示,去分类的一些内容。
安卓自带的dialog有三种:
这里写图片描述
- AlertDialog—-普通的提示对话框
- ProgressDialog–进度条对话
- DatePickerDialog/TimePickerDialog–日期对话框/时间对话框

所有的对话框,都是直接或间接继承自Dialog类,而AlterDialog直接继承自Dialog,其他的几个类均继承自AlterDialog。

系统自带的dialog基本上用AlertDialog类
 AlertDialog继承自Dialog类,对于Android内置的AlterDialog,它可以包含一个标题、一个内容消息或者一个选择列表、最多三个按钮。而创建AlterDialog推荐使用它的一个内部类AlterDialog.Builder创 建。使用Builder对象,可以设置AlterDialog的各种属性,最后通过Builder.create()就可以得到AlterDialog对 象,如果只是还需要显示这个AlterDialog,一般可以直接使用Builder.show()方法,它会返回一个AlterDialog对象,并且 显示它。
//说这么多,还不如直接看下如何用

下面我会讲三个层次的dialog的使用:

  • 简单的系统dialog调用//就是简单的系统dialog的调用
  • 半自定义的dialog//就是改变一些基础属性
  • 完全自定义dialog//自定义dialog类,自己写界面,点击事件
    ##简单的系统dialog
    简单的dialog也分好多种,但是我只说AlertDialog类的
    ###普通对话框
    这个就是最普通的那种,让你选择正确或者错误,也可以选择中立,这个是最常见的那种
    这里写图片描述
    用法很简单
  • 第一步:new个AlertDialog.Builder
  • 第二步:设置dialog的图标,文字,提示信息
  • 第三步:设置不同选择的点击事件
  • 第四步:显示dialog
 /*** 普通dialog*/private void showAlterDialog(){final AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this);alterDiaglog.setIcon(R.drawable.icon);//图标alterDiaglog.setTitle("简单的dialog");//文字alterDiaglog.setMessage("生存还是死亡");//提示消息//积极的选择alterDiaglog.setPositiveButton("生存", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this,"点击了生存",Toast.LENGTH_SHORT).show();}});//消极的选择alterDiaglog.setNegativeButton("死亡", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this,"点击了死亡",Toast.LENGTH_SHORT).show();}});//中立的选择alterDiaglog.setNeutralButton("不生不死", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this,"点击了不生不死",Toast.LENGTH_SHORT).show();}});//显示alterDiaglog.show();}

列表对话框

直接看图吧
这里写图片描述
这个和普通的dialog差不多,只不过是从中数组选择一个确定点击事件

 /*** 列表Dialog*/private void showListDialog(){final String[] items = {"我是1","我是2","我是3"};AlertDialog.Builder listDialog = new AlertDialog.Builder(MainActivity.this);listDialog.setIcon(R.drawable.icon);//图标listDialog.setTitle("我就是个列表Dialog");listDialog.setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this,"点击了"+items[which],Toast.LENGTH_SHORT).show();}});listDialog.show();}

单选对话框

它和列表对话框区别是前面有选择的圆点
也是一样的
这里写图片描述

 /*** 单选Dialog*/int choice;private void showSingDialog(){final String[] items = {"我是1","我是2","我是3"};AlertDialog.Builder singleChoiceDialog = new AlertDialog.Builder(MainActivity.this);singleChoiceDialog.setIcon(R.drawable.icon);singleChoiceDialog.setTitle("我是单选Dialo");//第二个参数是默认的选项singleChoiceDialog.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {choice= which;}});singleChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {if (choice!=-1){Toast.makeText(MainActivity.this,"你选择了" + items[choice],Toast.LENGTH_SHORT).show();}}});singleChoiceDialog.show();}

多选对话框

在单选的基础上加了多选这个,就是选择的函数不一样
这里写图片描述

 /*** 多选对话框*/ArrayList<Integer> choices= new ArrayList<>();private void showMultiChoiceDialog(){final String[] items = {"我是1","我是2","我是3"};//设置默认选择都是falsefinal boolean initchoices[] = {false,false,false};choices.clear();AlertDialog.Builder multChoiceDialog = new AlertDialog.Builder(MainActivity.this);multChoiceDialog.setIcon(R.drawable.icon);multChoiceDialog.setTitle("我是个多选Dialog");multChoiceDialog.setMultiChoiceItems(items, initchoices, new DialogInterface.OnMultiChoiceClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which, boolean isChecked) {if (isChecked){choices.add(which);}else {choices.remove(which);}}});multChoiceDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {int size = choices.size();String str = "";for(int i = 0;i<size;i++){str+=items[choices.get(i)]+"";}Toast.makeText(MainActivity.this,"你选中了" + str,Toast.LENGTH_SHORT).show();}});multChoiceDialog.show();}

等待对话框

等待Dialog具有屏蔽其他控件的交互能力
@setCancelable 为使屏幕不可点击,设置为不可取消(false) 
下载等事件完成后,主动调用函数关闭该Dialog
这里写图片描述 

 private void showProgressDialog(){final int MAX = 100;final ProgressDialog progressDialog = new ProgressDialog(this);progressDialog.setTitle("我是个等待的Dialog");progressDialog.setMessage("等待中");progressDialog.setIndeterminate(true);progressDialog.setCancelable(false);progressDialog.show();}

进度条对话框

就是和那些app上一样,简单的一个等待的框
这里写图片描述

/*** 进度条Dialog*/private void showWhiteDialog(){/* @setProgress 设置初始进度* @setProgressStyle 设置样式(水平进度条)* @setMax 设置进度最大值*/final int Max = 100;final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);progressDialog.setProgress(0);progressDialog.setIcon(R.drawable.icon);progressDialog.setTitle("我是一个进度条Dialog");progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);progressDialog.setMax(Max);progressDialog.show();/*** 开个线程*/new Thread(new Runnable() {@Overridepublic void run() {int p = 0;while (p<Max){try {Thread.sleep(100);p++;progressDialog.setProgress(p);}catch (InterruptedException e){e.printStackTrace();}}progressDialog.cancel();//达到最大就消失}}).start();}

半自定义对话框

就是根据一些属性来自定义dialog,也可以添加自己的布局

1控制不同普通的dialog的位置,大小,透明度

这里写图片描述
在不同的dialog的下面添加设置

 //自定义的东西//放在show()之后,不然有些属性是没有效果的,比如height和widthWindow dialogWindow = dialog.getWindow();WindowManager m = getWindowManager();Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值// 设置高度和宽度p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6p.width = (int) (d.getWidth() * 0.6); // 宽度设置为屏幕的0.65p.gravity = Gravity.TOP;//设置位置p.alpha = 0.8f;//设置透明度dialogWindow.setAttributes(p);

整体的代码:

 /*** 自定义1 控制普通的dialog的位置,大小,透明度* 在普通的dialog.show下面添加东西*/private void DiyDialog1(){AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this);alterDiaglog.setIcon(R.drawable.icon);//图标alterDiaglog.setTitle("简单的dialog");//文字alterDiaglog.setMessage("生存还是死亡");//提示消息//积极的选择alterDiaglog.setPositiveButton("生存", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this,"点击了生存",Toast.LENGTH_SHORT).show();}});//消极的选择alterDiaglog.setNegativeButton("死亡", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this,"点击了死亡",Toast.LENGTH_SHORT).show();}});alterDiaglog.setNeutralButton("不生不死", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Toast.makeText(MainActivity.this,"点击了不生不死",Toast.LENGTH_SHORT).show();}});AlertDialog dialog = alterDiaglog.create();//显示dialog.show();//自定义的东西//放在show()之后,不然有些属性是没有效果的,比如height和widthWindow dialogWindow = dialog.getWindow();WindowManager m = getWindowManager();Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值// 设置高度和宽度p.height = (int) (d.getHeight() * 0.4); // 高度设置为屏幕的0.6p.width = (int) (d.getWidth() * 0.6); // 宽度设置为屏幕的0.65p.gravity = Gravity.TOP;//设置位置p.alpha = 0.8f;//设置透明度dialogWindow.setAttributes(p);}

自定义简单dialog的布局

把自己写的xml加载进去
这里写图片描述
第一步:自定义布局
自己定义dialog_1.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayout
        android:layout_width="100dp"android:layout_height="100dp"android:layout_centerInParent="true"android:background="#ed093a"><TextView
            android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="自定义加强版的dialog"android:textColor="#fff"/></LinearLayout>
</RelativeLayout>

第二步:在主活动里面设置dialog
然后把这个布局扔进去

    /*** 自定义dialog2 简单自定义布局*/private void DiyDialog2() {AlertDialog.Builder alterDiaglog = new AlertDialog.Builder(MainActivity.this,R.style.MyDialog);alterDiaglog.setView(R.layout.dialog_1);//加载进去AlertDialog dialog = alterDiaglog.create();//显示dialog.show();//自定义的东西}

完全自定义dialog

重要来到了最重头戏了,然后自定义dialog然后满足产品的需求,你只需要按照如下步骤来:
这里写图片描述
1.在values/styles.xml新建一个样式MyDialog

<style name="MyDialog" parent="android:Theme.Dialog"><!-- 背景颜色及透明程度 --><item name="android:windowBackground">@android:color/transparent</item><!-- 是否半透明 --><item name="android:windowIsTranslucent">false</item><!-- 是否没有标题 --><item name="android:windowNoTitle">true</item><!-- 是否浮现在activity之上 --><item name="android:windowIsFloating">true</item><!-- 是否背景模糊 --><item name="android:backgroundDimEnabled">false</item><!-- 设置背景模糊的透明度--><item name="android:backgroundDimAmount">0.5</item>
</style>

2.新建一个MyDialog继承Dialog类

public class MyDialog1 extends Dialog implements View.OnClickListener{//在构造方法里提前加载了样式private Context context;//上下文private int layoutResID;//布局文件idprivate int[] listenedItem;//监听的控件idpublic MyDialog1(Context context,int layoutResID,int[] listenedItem){super(context,R.style.MyDialog);//加载dialog的样式this.context = context;this.layoutResID = layoutResID;this.listenedItem = listenedItem;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//提前设置Dialog的一些样式Window dialogWindow = getWindow();dialogWindow.setGravity(Gravity.CENTER);//设置dialog显示居中//dialogWindow.setWindowAnimations();设置动画效果setContentView(layoutResID);WindowManager windowManager = ((Activity)context).getWindowManager();Display display = windowManager.getDefaultDisplay();WindowManager.LayoutParams lp = getWindow().getAttributes();lp.width = display.getWidth()*4/5;// 设置dialog宽度为屏幕的4/5getWindow().setAttributes(lp);setCanceledOnTouchOutside(true);//点击外部Dialog消失//遍历控件id添加点击注册for(int id:listenedItem){findViewById(id).setOnClickListener(this);}}private OnCenterItemClickListener listener;public interface OnCenterItemClickListener {void OnCenterItemClick(MyDialog1 dialog, View view);}//很明显我们要在这里面写个接口,然后添加一个方法public void setOnCenterItemClickListener(OnCenterItemClickListener listener) {this.listener = listener;}@Overridepublic void onClick(View v) {dismiss();//注意:我在这里加了这句话,表示只要按任何一个控件的id,弹窗都会消失,不管是确定还是取消。listener.OnCenterItemClick(this,v);}
}

3.主活动继承自己写的dialog的接口,实现点击方法

//定义一个自己的dialogprivate MyDialog1 myDialog1;
//实例化自定义的dialogmyDialog1 = new MyDialog1(this,R.layout.dialog_2,new int[]{R.id.dialog_btn});//绑定点击事件myDialog1.setOnCenterItemClickListener((MyDialog1.OnCenterItemClickListener) this);//显示myDialog1.show();//调用点击函数@Overridepublic void OnCenterItemClick(MyDialog1 dialog, View view) {switch (view.getId()){case R.id.dialog_btn:Toast.makeText(getApplicationContext(),"点击了",Toast.LENGTH_SHORT).show();break;default:break;}}  

总结

最近项目还是没进度哇哇哇,心塞塞,准备开始弄个安卓游戏项目,要学一大堆东西。
https://github.com/sakurakid/DialogDemo这个的git地址,希望对别人有帮助 
 


http://chatgpt.dhexx.cn/article/Z89OwUhw.shtml

相关文章

Android/安卓 自定义Dialog 最简单、最详细解释

看了很多视频&#xff0c;也在网上找了一些浏览量最多的文章&#xff0c;发现都太难懂或者太复杂&#xff0c;夹杂了很多其他功能&#xff0c;自定义度太高&#xff0c;很繁琐。所以我想写一个基础的自定义Dialog&#xff0c;只涉及基础的自定义&#xff0c;其他复杂的自定义可…

自定义Dialog的详细步骤(实现自定义样式一般原理)

转载请标注转载http://blog.csdn.net/oqihaogongyuan/article/details/50958659 自定义Dialog的详细步骤&#xff08;实现自定义样式一般原理&#xff09; 现在很多App的提示对话框都非常有个性&#xff0c;然而你还用系统的对话框样式&#xff0c;是不是觉得很落后呢&#xf…

CSS 文字超出部分显示省略号

一&#xff1a; title { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } 以上 CSS 适用于单行文字超出部分&#xff0c;显示「省略号」。如图&#xff1a; 二&#xff1a; title { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-cl…

css三行代码实现多行文字超出部分省略号代替

就是我们在页面开发的时候有时为了更加美观&#xff0c;让文字在同行显示&#xff0c;超出的部分用省略号替代 而这个效果我们直接实现3行css实现 white-space: nowrap; 让文字在一行显示&#xff0c;不允许换行 overflow: hidden; 超出部分隐藏 text-overflow: ellipsis; 超…

IOS不兼容超出部分省略号 且页面显示不起作用 行数限定无作用

IOS不兼容超出部分省略号 且页面显示不起作用 行数限定无作用 换成下面的写法 overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 1;-webkit-box-orient: vertical;

CSS超出部分省略号

1&#xff0c;单行文本实现超出部分省略号 overflow:hidden; //超出的文本隐藏 text-overflow:ellipsis; //溢出用省略号显示 white-space:nowrap; //溢出不换行 2&#xff0c;多行文本实现超出部分省略号 overflow:hidden; text-overflow:ellipsis; display:-webkit-b…

css文字超出部分省略号代替

问题 之前做过好过网页&#xff0c;其中经常遇到一个常用的知识点&#xff0c;就是当文字超出界面的范围&#xff0c;用省略号代替显示&#xff0c;给网页一美观。 解决方案 1.单行显示省略号&#xff1a; 点击查看代码详情 效果如下: 2.多行显示省略号&#xff1a; 点击…

CSS文字超出部分省略号显示

文章目录[隐藏] CSS 文字超出部分省略号显示前言CSS 文字超出部分省略号显示实现方法CSS 文字超出部分省略号显示实现效果 CSS 文字超出部分省略号显示前言 在我们开发过程中&#xff0c;其实有这样的需求&#xff1a; 在一个文章列表中&#xff0c;文章摘录太长了会影响排版格…

css 文字换行和超出部分省略号

css 文字换行和超出部分省略号 文字空格与换行 当文本溢出父级 block 元素时, 文本会换行; 这个特性是通过 white-space 控制的; 它影响浏览器处理空格, 换行和 tab 的处理; 它有下面几种值 normal, 默认值, 连续的空白符会被合并&#xff0c;换行符会被当作空白符来处理。…

overflow超出部分省略号

实现上图所示样式 单行超市省略号 width: 9rem;overflow: hidden;text-overflow: ellipsis;white-space: nowrap; //单行超出显示省略号可设置多行超出省略 //两行超出.overhide {display: -webkit-box !important;text-overflow: ellipsis;overflow: hidden;-webkit-line-cla…

html字体超出后隐藏省略号,CSS控制文字超出部分省略号显示

一:单行文本显示不完时,我们只需要设置单行文本的宽度,不允许换行,溢出隐藏及换行省略四个属性即可: p{max-width: 100px; overflow:hidden; text-overflow:ellipsis; /*禁止换行显示*/ white-space:nowrap; background-color:#ffe51a; } 哈哈哈哈哈哈哈,哈哈哈哈哈,哈哈…

文本超出部分显示省略号

我们经常在网站上可以看到以下样式&#xff0c;标题太长&#xff0c;一行显示不下&#xff0c;则会使用省略号来代替。但是事实上&#xff0c;这个省略号并不是打字打上去的&#xff0c;而是使用代码表示出来的。 今天则主要介绍如何让文本超出部分显示省略号。 1.单行文本超出…

CSS中 设置( 单行、多行 )超出显示省略号

1. 设置超出显示省略号 css设置超出显示省略号可分两种情况&#xff1a; 单行文本溢出显示省略号…多行文本溢出显示省略号… 但使用的核心代码是一样的&#xff1a;需要先使用 “overflow:hidden;” 来把超出的部分隐藏&#xff0c;然后使用“text-overflow:ellipsis;”当文…

文本超出显示省略号的方法

1、一行文本超出显示省略号的方法&#xff1a;text-overflow和white-space超出隐藏显示省略号 设计css样式时&#xff0c;遇到要使文本在一行内显示&#xff0c;超出则加省略号的问题解决办法&#xff1a; 只需要使用text-overflow和white-space来使文本在一行内显示&#xff…

文字超出部分变成省略号的三种方式

目录 1.单行文本溢出显示省略号 实例&#xff1a; 2.多行文本溢出显示省略号 实例&#xff1a; 3.利用伪类实现省略号 实例&#xff1a; 1.单行文本溢出显示省略号 .box {/*强制文本在一行内显示*/white-space: nowrap; overflow: hidden;text-overflow: ellipsis; } 实例&a…

pytorch函数中的dilation参数的作用

举例子说明&#xff1a; 1.dilation1的话&#xff08;默认情况&#xff09;&#xff0c;效果如图&#xff1a; 2.dilation2&#xff0c;那么效果如图&#xff1a; 输入是蓝色&#xff0c;绿色是输出&#xff0c;可以看到dilation1时输入间隔着一个格子。

Pytorch 网络中dilation=0和dilation=N (N=1,2,3,...)的区别

假设输入为4x4&#xff0c;卷积核为3x3&#xff0c;stride1&#xff0c;此时dilation1的卷积情况&#xff1a; 下面是输入为7x7&#xff0c;卷积核为3x3&#xff0c;stride1&#xff0c;dilation2时候的卷积情况 在这种情况下&#xff0c;卷积核的感受野由原来的3x3变成了现在…

pytorch之nn.Conv1d详解

博主欢迎转载&#xff0c;但请一定要给出原文链接&#xff0c;标注出处&#xff01;&#xff01;&#xff01;谢谢~ pytorch之nn.Conv1d详解 &#xff08;没想到当初整理这篇&#xff0c;竟然有那么多人看&#xff0c;而且还有不少人提问。由于CSDN不常登陆&#xff0c;所以评…

语义分割 - DeepLab系列(v1, v2, v3, v3+)

目录 论文精读四种版本网络的对比v1v2v3v3 先验知识分辨率的损失多尺度特征&#xff08;multi-scale features&#xff09;空洞卷积&#xff08;Dilated/Atrous Convolution&#xff09;标准卷积与空洞卷积空洞卷积的作用为了保证输出图像尺寸不变时&#xff0c;padding的设定值…

从一维卷积、因果卷积(Causal CNN)、扩展卷积(Dilation CNN) 到 时间卷积网络 (TCN)

来源: AINLPer微信公众号&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2022-09-30 引言 卷积神经网络 (CNN) 尽管通常与图像分类任务相关&#xff0c;但经过改造&#xff0c;同样可以用于序列建模预测。在本文中&#xf…