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

article/2025/11/5 19:52:05

看了很多视频,也在网上找了一些浏览量最多的文章,发现都太难懂或者太复杂,夹杂了很多其他功能,自定义度太高,很繁琐。所以我想写一个基础的自定义Dialog,只涉及基础的自定义,其他复杂的自定义可以在这个的基础上自己添加shape或Backgroud定义颜色和形状。

先看一下效果图

Android 自定义Dialog

下面开始讲解自定义Dialog的步骤

一、第一步,先创建一个dialog的布局layout_custom_dialog,这就是我们弹出的对话框样式(简单

 代码段 

        代码中父布局中的backgroud设置了布局的圆角,这个比较简单,不会的可以看一下我写的另外一篇文章。

<?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:background="@drawable/bg_custom_dialog"android:gravity="center_horizontal"android:orientation="vertical"><TextViewandroid:id="@+id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="提  示"android:textColor="@color/black"android:textSize="20sp"android:textStyle="bold" /><TextViewandroid:id="@+id/message"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="是否确定执行此操作?"android:textColor="@color/black"android:textSize="20sp" /><Viewandroid:layout_width="match_parent"android:layout_height="0.5dp"android:layout_marginTop="20dp"android:background="#888888" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="50dp"android:orientation="horizontal"><TextViewandroid:id="@+id/cancel"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="取消"android:textColor="@color/black"android:textSize="20sp" /><Viewandroid:layout_width="0.5dp"android:layout_height="match_parent"android:background="#888888" /><TextViewandroid:id="@+id/confirm"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="确定"android:textColor="#0582FF"android:textSize="20sp" /></LinearLayout></LinearLayout>

效果图

 

二、第二步, 我们新建一个java文件,名称为CustomDialog。(重难点

代码段

一、创建一个classCustomDialog继承Dialog并且实现View.OnClickListener接口。 

二、重写CustomDialog和onCreate方法,这样,一个自定义Dialog框架就写好了,接下来需要实现他的功能。

        (!!!)我们可以看到第一步写的布局中有很多TextView文本,那么在一个高度自定义的Dialog中是需要能够重新编写这些文字的,所以,我们需要能够设置这些文本的set方法,下面我们来实现set方法。

        1、声明控件mTitle, mMessage, mConfirm, mCancel。声明字符串sTitle,sMessage, sConfirm, sCancel。

        2、在onCreate方法中找到四个控件。

        3、右键点击声明的字符串,generate->setter,按住ctrl键点击sTitle,sMessage, sConfirm, sCancel,创建这四个字符串的set方法,这样就得到了四个set方法,如果调用的时候想要使用链式调用,可以象我这样把四个方法的void改成CustomDialog并且返回this。

        4、set方法虽然设置了我们想要的字符串,但是还没有将这些字符串传给我们的布局中,所以我们需要在onCreate方法里设置一下(见代码),如果我们设置的字符串不是空的话,就将其赋值给布局中的text。

 

三、重头戏来了 !我们在自定义Dialog时设置了两个实现按键功能的cancel和confirm,所以还需要设置监听事件,所以我们还需要在setsConfirm和setsCancel的同时设置监听事件。

        1、首先声明两个监听器cancelListener, confirmListener

        2、在setsConfirm和setsCancel方法中写两个监听器并且将这两个监听器分别传给上面声明的两个监听器。

        3、重写onClick方法,并且在onCreat方法中设置监听器。

四、由于新版本原因以及自定义Dialog时会自动将宽度设置为wrap,所以我们需要自己设置Dialog的宽度,代码如下。另外由于不明确的原因,无法在调用Dialog时设置点击空白处不消失,所以只能在Dialog中设置setCancelable(false);另外,如果调用时发现圆角无法生效,在代码中设置getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT))即可。

package com.example.test2.widget;import android.app.Dialog;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;import androidx.annotation.NonNull;import com.example.test2.R;public class CustomDialog extends Dialog implements View.OnClickListener {private TextView mTitle, mMessage, mConfirm, mCancel;private String sTitle, sMessage, sConfirm, sCancel;private View.OnClickListener cancelListener, confirmListener;public CustomDialog setsTitle(String sTitle) {this.sTitle = sTitle;return this;}public CustomDialog setsMessage(String sMessage) {this.sMessage = sMessage;return this;}public CustomDialog setsConfirm(String sConfirm, View.OnClickListener listener) {this.sConfirm = sConfirm;this.confirmListener = listener;return this;}public CustomDialog setsCancel(String sCancel, View.OnClickListener listener) {this.sCancel = sCancel;this.cancelListener = listener;return this;}public CustomDialog(@NonNull Context context) {super(context);}public CustomDialog(@NonNull Context context, int themeResId) {super(context, themeResId);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_custom_dialog);getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));setCancelable(false);//自定义Dialog宽度WindowManager m = getWindow().getWindowManager();Display d = m.getDefaultDisplay();WindowManager.LayoutParams p = getWindow().getAttributes();Point size = new Point();d.getSize(size);p.width = (int) ((size.x)*0.7);        //设置为屏幕的0.7倍宽度getWindow().setAttributes(p);mTitle = findViewById(R.id.title);mMessage = findViewById(R.id.message);mCancel = findViewById(R.id.cancel);mConfirm = findViewById(R.id.confirm);if (!TextUtils.isEmpty(sTitle)) {mTitle.setText(sTitle);}if (!TextUtils.isEmpty(sMessage)) {mMessage.setText(sMessage);}if (!TextUtils.isEmpty(sCancel)) {mCancel.setText(sCancel);}if (!TextUtils.isEmpty(sConfirm)) {mConfirm.setText(sConfirm);}mConfirm.setOnClickListener(this);mCancel.setOnClickListener(this);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.confirm:if(confirmListener != null){confirmListener.onClick(view);}break;case R.id.cancel:if(cancelListener != null){cancelListener.onClick(view);}break;}}}

三、第三步,新建一个Activity

        在布局中写一个按钮,在activity中声明并设置监听,然后就可以直接使用自定义Dialog啦

package com.example.test2;import android.os.Bundle;
import android.view.View;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;import com.example.test2.widget.CustomDialog;public class CustomDialogActivity extends AppCompatActivity {private Button mBt;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_custom_dialog);mBt = findViewById(R.id.bt_dialog);mBt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {CustomDialog customDialog = new CustomDialog(CustomDialogActivity.this);customDialog.setsTitle("warning").setsMessage("are you sure?").setsCancel("cancel", new View.OnClickListener() {@Overridepublic void onClick(View view) {customDialog.dismiss();}}).setsConfirm("sure", new View.OnClickListener() {@Overridepublic void onClick(View view) {}}).show();}});}
}


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

相关文章

自定义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…

Pytorch之经典神经网络语义分割(3.1) —— 空洞卷积 Dilated conv/Atrous Conv (膨胀卷积/扩张卷积)(扩张率dilation rate) pytorch实现

2016年提出的 空洞卷积广泛应用于语义分割与目标检测等任务中 空洞卷积(膨胀卷积/扩张卷积) Dilated/Atrous Convolution 空洞卷积是一种不增加参数量(运算量)同时增加输出单元感受野的一种方法。Atrous 卷积&#xff0c;就是带洞的卷积&#xff0c;卷积核是稀疏的 此外&#x…