在原生android里面,有两种dialog写法,一种是直接使用里面提供的AlertDialog.Builder方法去使用,另一种是我们自己根据自己的ui来设计(自定义)。在一般开发中,我们主要使用的是自定义,主要是AlertDialog.Builder提供的dialog不够美观,此外也可能无法满足我们的业务要求,但为了大家理解dialog这一个情况,我们两种都介绍一下。

1.AlertDialog.Builder方法

AlertDialog.Builder方法中创建dialog我们只需要在java(或kotlin中)调用提供的方法,不需要我们自己去布局xml,我以java来介绍:

(1)创建对象

AlertDialog.Builder builder = new AlertDialog.Builder(this);

(2)调用对象方法

setTitle();设置弹框标题
setMessage();设置弹框信息
builder.setTitle("提示");
builder.setMessage("是否要关闭这个程序");

(3)添加点击按钮以及点击事件

在android开发弹框里,我们只有三种按钮可以设置,分别是消极(negative)、中立(neutral)、积极(positive)按钮,一个按钮只能设置一个,多次设置会由最新的覆盖老的。消极按钮一般用于cancel等取消按键,积极按钮则是sure等确认按键,中立一般需要看业务来进行设置和配置。

在这个过程中,我们用的方法只有下面两种,当我们不想传入点击事件的话我们可以使用null,此外补充一点,在点击事件里的finish是退出程序结束程序进程的作用:

setPositiveButton();设置积极按钮
setNeutralButton();设置中立按钮
setNegativeButton();设置消极按钮
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {finish();}});
builder.setNegativeButton("取消",null);

(4)展示dialog

builder.show();

效果如下:

怎么样,样式是不是很有年代感,所以我们在原生开发中,一般都会使用自定义来满足我们的业务需求和美观需求,接下来我将展示简约的自定义弹框 。

2.自定义方法

(1)设计xml布局

首先我们要设计我们自定义弹框的布局,我下面设计了一个简约的弹框:

activity_newdialog

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/dialog"android:clickable="true"android:orientation="vertical"><TextViewandroid:id="@+id/tips_title"android:textSize="15sp"android:textStyle="bold"android:gravity="center"android:textColor="@color/black"android:text="弹框"android:layout_marginStart="30dp"android:layout_marginEnd="30dp"android:layout_marginTop="20dp"android:layout_width="match_parent"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/tips"android:layout_marginTop="12dp"android:layout_marginStart="30dp"android:layout_marginEnd="30dp"android:layout_marginBottom="20dp"android:textSize="15sp"android:gravity="center"android:textColor="#888888"android:layout_width="match_parent"android:layout_height="wrap_content" /><Viewandroid:background="#EEEEEE"android:layout_width="match_parent"android:layout_height="0.5dp"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/negative_btn"android:layout_marginTop="15dp"android:layout_marginStart="20dp"android:layout_marginEnd="20dp"android:layout_marginBottom="15dp"android:gravity="center"android:textColor="@color/black"android:textStyle="bold"android:textSize="15.55sp"android:text="cancel"android:layout_weight="0.5"android:layout_width="match_parent"android:layout_height="wrap_content" /><Viewandroid:background="#EEEEEE"android:layout_width="0.5dp"android:layout_height="match_parent"/><TextViewandroid:id="@+id/positive_btn"android:layout_marginTop="15dp"android:layout_marginStart="20dp"android:layout_marginEnd="20dp"android:layout_marginBottom="15dp"android:text="sure"android:textColor="@color/black"android:textSize="15.55sp"android:textStyle="bold"android:layout_weight="0.5"android:gravity="center"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>
</LinearLayout>

(2)创建MyDialogActivity

我们创建我们对应的Activity文件,为什么创建这个呢,创建后我们就可以当对象方法使用,我们可以在本文件中设计点击事件,需注意的是,本文件需要继承Dialog类

package com.example.myapplication;import android.app.Dialog;
import android.content.Context;
import android.view.View;import androidx.annotation.NonNull;public class MyDialogActivity extends Dialog {public MyDialogActivity(@NonNull Context context, int themeResId) {super(context, themeResId);setContentView(R.layout.activity_newdialog);findViewById(R.id.positive_btn).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {System.exit(0);}});findViewById(R.id.negative_btn).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {dismiss();}});}
}

话外载体一嘴,我们这里是没有finish方法的,那我们替换为System.exit(0);

(3)设置样式

因为我们后面实例化样式的话需要传递两个参数,一个是this,还有一个是我们的样式,所以我们在themes下创建样式

    <style name="mydialog" parent="Theme.MaterialComponents.Dialog"><!-- 透明背景 --><item name="android:windowBackground">@android:color/transparent</item><!-- 隐藏标题栏 --><item name="android:windowNoTitle">true</item><!-- 文字颜色 --><item name="android:textColorPrimary">@color/black</item><!-- 按钮样式 --><item name="buttonBarPositiveButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Dialog</item><item name="buttonBarNegativeButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Dialog</item></style>

(4)实例化对象并使用

MyDialogActivity md = new MyDialogActivity(this,R.style.mydialog);
md.show();

最终效果展示:

嗯?是不是比原本原生提供的好看?嗯?那我问你,look at my eyes。

下课! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89471.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89471.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/89471.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nacos 开源 MCP Router,加速 MCP 私有化部署

作者&#xff1a;正己 Nacos MCP Router 简介 Nacos MCP Router 是一个基于 MCP 官方 SDK 开发的标准 MCP Server&#xff0c;为 MCP Client 提供 MCP Server 的智能搜索、安装、代理等功能&#xff0c;极大地简化了 MCP 服务的使用流程。同时&#xff0c;Nacos MCP Router 跟…

【赵渝强老师】Redis的主从复制集群

Redis的主从复制是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为Master主节点&#xff0c;后者称为Slave从节点。数据的复制是单向的&#xff0c;只能由主节点到从节点。在默认情况下每台Redis服务器都是主节点。一个主节点可以有多个从节点或者没有…

Git 子模块只更新部分模块的问题排查总结

Git 子模块只更新部分模块的问题排查总结 问题描述 在执行 git submodule update --init --recursive 命令时&#xff0c;虽然 .gitmodules 文件中定义了 3 个子模块&#xff0c;但只有 handy-ollama 被更新&#xff0c;其他两个子模块没有被处理。 > git submodule upda…

React 源码7:Lane、React和schedule优先级转换

在《源码3》requestUpdateLane函数根据eventLane获取不同情况对应优先级。一、优先级1.Lane的tag一共有32种lane。var TotalLanes 31; var NoLanes /* */ 0; var NoLane /* */ 0; var SyncLane /* …

Linux RDMA Maillist patchsets (Jul. 7 - Jul. 13, 2025)

1. Optimize DMABUF Mkey Page Size in mlx5 优化 mlx5 中的 DMABUF Mkey 页大小 This patch series enables the mlx5 driver to dynamically select the optimal page size for DMABUF-based memory keys (mkeys), rather than relying on a fixed page size during registr…

Maven详细解

Maven 工具介绍 Maven是Apache组织下的一个跨平台的项目管理工具&#xff0c;它主要用来帮助实现项目的构建、测试、打包和部署。Maven 提供了标准的软件生命周期模型和构建模型&#xff0c;通过配置就能对项目进行全面的管理。它的跨平台性保证了在不同的操作系统上可以使用相…

Springboot儿童摄影服务91f0v(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;用户,员工,摄影套餐,套餐系列,客片欣赏,摄影预约,摄影订单,取片通知,摄影评价开题报告内容基于Spring Boot的儿童摄影服务系统设计与实现开题报告一、研究背景与意义随着国家生育政策调整&#xff0c;儿童摄影市场需求呈现爆发式增长。以北…

vue-seo优化

一、为什么 Vue 需要专门做 SEO Vue 默认是客户端渲染 SPA&#xff0c;首屏 HTML 几乎为空&#xff0c;爬虫抓取不到内容&#xff1b;即使 Googlebot 能执行 JS&#xff0c;也存在“渲染预算”与加载延迟问题 二、技术落地 4 条路线 场景技术选型实现要点适用内容更新频…

DNS防护实战:用ipset自动拦截异常解析与群联AI云防护集成

问题场景 DNS服务器常成为黑客探测源IP的首选目标。攻击者通过高频DNS查询获取解析记录&#xff0c;或利用异常请求触发服务器响应&#xff0c;从而定位源站IP。传统单IP拦截效率低下&#xff0c;难以应对分布式攻击。 核心解决方案 ipset自动化拦截 ipset是iptables的扩展&…

养老院跌倒误报频发?陌讯时空图卷积实现95%精准检测

​开篇痛点​​> "传统视觉算法在养老院场景面临三大挑战&#xff1a; > ① 夜间低光照下识别率骤降&#xff08;<50% mAP&#xff09; > ② 多人遮挡场景姿态检测漂移 > ③ 跌倒误报率高达30%&#xff08;某养老机构2024年报告&#xff09;"通…

[spring6: BeanPostProcessor BeanFactoryPostProcessor]-生命周期

BeanFactoryPostProcessor BeanFactoryPostProcessor 接口允许在 Spring 容器初始化完所有的 bean 定义之后&#xff0c;但还未实例化任何 bean 时&#xff0c;修改应用上下文的内部 bean 工厂。通过实现 postProcessBeanFactory 方法&#xff0c;你可以覆盖或添加属性&#xf…

MISRA C-2012准则之声明与定义

目录 一、MISRA C简介 二、声明与定义 1. 必需。类型应被显式声明。 2. 必需。函数应以原型形式命名参数。 3. 必需。所有对象和函数的声明需要使用完全相同的名字和参数。 4. 必需。当定义有外部链接的对象或函数时&#xff0c;兼容声明应是可见的。 5. 必需。外部变量…

【blender】使用Vscode进行blender调试

配置vscodeblender 直接使用blender中的text editor没有代码补全&#xff0c;终端输出通常和blender不在同一个页面&#xff0c;只适合非常简单的代码测试。使用Vscode能有效提高blender调试的效率&#xff0c;具体方式见&#xff1a;VSCode 开发 Blender脚本工具配置。 调试…

Au速成班-乐理知识补充+网页下载音乐

音质分类 通过查看音频频谱&#xff0c;128Kbps、192Kbps、320Kbps、无损&#xff08;Lossless HD&#xff09;CD音质&#xff08;频率都在20kHz以上&#xff09;。 各家平台对无损的定义不一样&#xff0c;em各有说法吧。 无损的含义是&#xff1a;无损失的声音格式。只要能…

JAVA中的Collection集合及ArrayList,LinkedLIst,HashSet,TreeSet和其它实现类的常用方法

文章目录前言一、Collection 接口常用方法1.boolean add(E e)2.boolean remove(Object o)3.boolean contains(Object o)4.boolean isEmpty()5.int size()6.void clear()7.Object[] toArray()8.boolean containsAll(Collection<?> c)9.boolean addAll(Collection<? e…

有n棍棍子,棍子i的长度为ai,想要从中选出3根棍子组成周长尽可能长的三角形。请输出最大的周长,若无法组成三角形则输出0。

题目描述&#xff1a; 有n棍棍子&#xff0c;棍子i的长度为ai&#xff0c;想要从中选出3根棍子组成周长尽可能长的三角形。请输出最大的周长&#xff0c;若无法组成三角形则输出0。 算法为O(nlogn) 初始理解题目 首先&#xff0c;我们需要清楚地理解题目要求&#xff1a; 输入…

【Echarts】 电影票房汇总实时数据横向柱状图比图

效果图code <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>圆角柱状图</title><script src"https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js"></script> </head> <…

【深度学习基础】PyTorch中model.eval()与with torch.no_grad()以及detach的区别与联系?

目录1. 核心功能对比2. 使用场景对比3. 区别与联系4. 典型代码示例(1) 模型评估阶段(2) GAN 训练中的判别器更新(3) 提取中间特征5. 关键区别总结6. 常见问题与解决方案(1) 问题&#xff1a;推理阶段显存爆掉(2) 问题&#xff1a;Dropout/BatchNorm 行为异常(3) 问题&#xff1…

博客摘录「 华为云平台-FusionSphere OpenStack 8.2.1 系统加固」2025年7月15日

编号 加固项 "风险 等级" 加固原理/Rationale 审计方法/Audit 期望结果/Expect Results 加固方法/Remediation 1 OpenSSH加固配置 1.1 OpenSSH加固配置 1.1.1 SSH使用的版本 H "Op…

永磁同步电机MTPA与MTPV曲线具体仿真实现

永磁同步电机MTPA与MTPV曲线具体仿真实现 近期做了一些标定试验&#xff0c;实际电机参数并不是确定的&#xff0c;而是变化的&#xff0c;因此很难通过解析的方法算出MTPA的对应点&#xff0c;以及在弱磁区如何过度到MTPV。这个在实际情况下都是一点点标出来的&#xff0c;我这…