【Android】常用对话框大全(二)Material Dialog

2023-11-09

前言

上一篇文章中,谈到本系列的文章将讲解Android dialog、Material dialog,为何要谈论Material呢?开发过Flutter的开发者也许就会明白,Material Design框架Flutter也在用,而在其官网的介绍中是这样说的:Material 是 Google 创建的一个设计系统,旨在帮助团队为 Android、iOS、Flutter 和 Web 构建高质量的数字体验。可想而知,Material Design的应用有多广,这,便是博主将Material Dialog带入到本系列文章的原因。

Android常用对话框系列文章

【Android】常用对话框大全(一)Android Dialog

【Android】常用对话框大全(二)Material Dialog

【Android】常用对话框大全(三)自定义Dialog的三种方式(Theme,PopupWindow,Dialog)

使用Material Design请确保已导入以下依赖

implementation 'com.google.android.material:material:1.5.0'

MaterialAlertDialogBuilder系列

Marterial Dialog系列采用的是MaterialAlertDialogBuilder类实现,其父类继承自AlertDiolag.Builder,是AlertDialog.Builder的扩
展,也就意味着AlertDialog.Buider所拥有的属性,Material Dialog也可以使用。

需要注意的是,MaterialAlertDialogBuilder的源码中,MaterialAlertDialogBuilder类会根据当前主题的样式来修改当前的Dialog样式,要想展示Material Dialog真正的样式,需要将AndroidManifest.xml文件里的android:theme修改为以下主题之一才能生效。

Theme Describe
Theme.Material3.Light 亮,亮色系主题白色为主
Theme.Material3.Light.NoActionBar 亮,亮色系主题白色为主,且无ActionBar
Theme.Material3.Dark 暗,暗色系主题为主
Theme.Material3.Dark.NoActionBar 暗,暗色系主题为主,且无ActionBar
Theme.Material3.DayNight Theme.Material3.Light
Theme.Material3.DayNight.NoActionBar Theme.Material3.Light.NoActionBar

接下来编写代码,带大家见识一下Marterial Dialog长啥样。

提示对话框

在这里插入图片描述

实现代码:

MaterialAlertDialogBuilder(this)
		    .setTitle("消息对话框")
		    .setMessage("这是一个消息对话框!")
		    .setNegativeButton("不像") { dialog, which ->
		        showMessage(view,"真不像?")
		    }
		    .setPositiveButton("明明就是") { dialog: DialogInterface?, which: Int ->
		        showMessage(view,"明明就是")
		    }
		    .show()
use methods Describe
setTitle(CharSequence title) 设置对话框中显示的标题
setMessage(CharSequence message) 设置要显示的消息
setNegativeButton(CharSequence text, final OnClickListener listener) 设置按下对话框的否定按钮时要调用的侦听器
setPositiveButton(CharSequence text, final OnClickListener listener) 设置按下对话框的肯定按钮时要调用的侦听器

左右按钮对话框

在这里插入图片描述
实现代码:

MaterialAlertDialogBuilder(this)
            .setMessage("左右按钮对话框!")
            .setNeutralButton("左") { dialog: DialogInterface?, which: Int -> showMessage(view,"左") }
            .setPositiveButton("右") { dialog: DialogInterface?, which: Int -> showMessage(view,"右") }.show()
use methods Describe
setMessage(CharSequence message) 设置要显示的消息
setNeutralButton(CharSequence text, final OnClickListener listener) 设置按下对话框的中性按钮时要调用的侦听器
setPositiveButton(CharSequence text, final OnClickListener listener) 设置按下对话框的正按钮时要调用的侦听器

列表对话框

在这里插入图片描述

MaterialAlertDialogBuilder(this)
            .setItems(items) { dialog: DialogInterface?, which: Int -> showMessage(view,"点击了列表对话框的 " + items[which]) }
            .show()
use methods Describe
setItems(CharSequence[] items, final OnClickListener listener) 设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器通知您选择的项目

单选对话框

在这里插入图片描述

实现代码:

MaterialAlertDialogBuilder(this)
            .setTitle("单选对话框")
            .setSingleChoiceItems(items,0) { dialog: DialogInterface?, which: Int ->
                singleSelectResult = items[which]
            }
            .setPositiveButton("确定") { dialog: DialogInterface?, which: Int ->
                showMessage(view,singleSelectResult)
            }
            .show()
use methods Describe
setTitle(CharSequence title) 设置Dialog中显示的标题
setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener) 设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。该列表将在选中项目的文本右侧显示一个复选标记。单击列表中的项目不会关闭对话框。单击按钮将关闭对话框。
setPositiveButton(CharSequence text, final OnClickListener listener) 设置按下对话框的正按钮时要调用的侦听器

多选对话框

在这里插入图片描述

实现代码:

val bool = booleanArrayOf(false, false, false, false)
MaterialAlertDialogBuilder(this)
    .setTitle("多选对话框")
    .setMultiChoiceItems(items,bool) { dialog: DialogInterface?, which: Int, isChecked: Boolean -> }
    .setPositiveButton("确定") { dialog: DialogInterface?, which: Int ->
        var result = "选中了"
        for (i in bool.indices) {
            if (bool[i]) {
                result += items[i]
            }
        }
        showMessage(view,result)
    }.show()
use methods Describe
setTitle(CharSequence title) 设置Dialog中显示的标题
setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems, final OnMultiChoiceClickListener listener) 设置要在对话框中显示的项目列表作为内容,您将通过提供的侦听器收到所选项目的通知。该列表将在每个选中项目的文本右侧显示一个复选标记。单击列表中的项目不会关闭对话框。单击按钮将关闭对话框。
setPositiveButton(CharSequence text, final OnClickListener listener) 设置按下对话框的正按钮时要调用的侦听器

无半径对话框

MaterialAlertDialogBuilder的对话框样式默认是带半径的,那我要去掉咋办?

MaterialAlertDialogBuilder没有setRadius(int radius),需要换一种想法,比如,创建一个drawable改一下Background试试。

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
	<!-- 背景颜色为白色 -->
    <solid android:color="@color/white"/>
</shape>
use methods Describe
setBackground(Drawable background) 修改对话框背景

效果如下:

在这里插入图片描述

MaterialAlertDialogBuilder属性

点击前往Android官网查看 MaterialAlertDialogBuilder 全部属性

日期时间系列

时间选择器

MaterialTimePicker

在这里插入图片描述
在这里插入图片描述

实现代码:

MaterialTimePicker.Builder().build().show(supportFragmentManager,"1")
MaterialTimePicker属性

点击前往Android官网查看 MaterialTimePicker 全部属性

日期选择器

MaterialDatePicker

在这里插入图片描述
在这里插入图片描述

实现代码:

MaterialDatePicker.Builder.datePicker().build().show(supportFragmentManager,"1")
MaterialDatePicker属性

点击前往Android官网查看 MaterialDatePicker 全部属性

底部对话框

底部对话框采用的是BottomSheetDialog实现,使用方式简单,创建一个名为bottom_sheet_dialog.xml的layout文件,实例化一下BottomSheetDialog就差不多完成啦!

<?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="match_parent"
    android:layout_gravity="bottom|center_horizontal"
    android:background="@null"
    android:orientation="vertical">

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:gravity="center"
        android:text="标题"
        android:textStyle="bold"
        android:background="@null"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:background="#C8C2C2" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:gravity="center"
        android:text="Item 1" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:gravity="center"
        android:text="Item 2" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="35dp"
        android:gravity="center"
        android:text="Item 3" />

</LinearLayout>
val dialog = BottomSheetDialog (this);
dialog.setContentView(R.layout.bottom_sheet_dialog)
dialog.show()

效果如图:
在这里插入图片描述
BottomSheetDialog 的使用也是这样的简单,but,如果要尝试去修改它的背景的话,新人一般都会踩到一个坑,那就是背景的半径无法被修改,这是由于BottomSheetDialog 自带的背景造成的(与其它Dialog自定义半径所产生的问题类似),这时候我们需要去隐藏掉BottomSheetDialog 自带的背景。

but,BottomSheetDialog并没有修改背景的方法,修改BottomSheetDialog背景得依靠继承BottomSheetDialogFragment类并重写onCreate(savedInstanceState: Bundle?)onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?)并新建一个新的样式覆盖原有样式方可,如下:

class CustomBottomSheetDialogFragment : BottomSheetDialogFragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 可选的style:STYLE_NORMAL, STYLE_NO_TITLE, STYLE_NO_FRAME, STYLE_NO_INPUT.
        setStyle(STYLE_NORMAL, R.style.BottomSheetDialog)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.bottom_sheet_dialog, container, false)
    }
}

在themes.xml新建style

<!--实现BottomSheetDialog圆角效果-->
<style name="BottomSheetDialog" parent="Theme.Design.Light.BottomSheetDialog">
    <item name="bottomSheetStyle">@style/bottomSheetStyleWrapper</item>
</style>

<style name="bottomSheetStyleWrapper" parent="Widget.Design.BottomSheet.Modal">
    <item name="android:background">@android:color/transparent</item>
</style>

紧接着回到界面去实例化对话框并将其展示出来

val bottomSheetDialog = CustomBottomSheetDialogFragment()
        bottomSheetDialog.show(supportFragmentManager, "1")

最终效果如下:

在这里插入图片描述

注意事项

1、开发初期就应该得考虑是否使用Material Design,一旦决定使用Material Design,App大部分组件都应该使用Material Design,尽量的去避免UI碎片化。


点击下载源码

参考文档:
1、Material官网
2、Android Material组件入门
3、BottomSheetDialog 使用详解
4、Material Android官网(Dialogs)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Android】常用对话框大全(二)Material Dialog 的相关文章

随机推荐

  • 两数之和:给定一个整数数组,找出其中两个数相加等于目标值

    题目 给定一个整数数列 找出其中和为特定值的那两个数 你可以假设每个输入都只会有一种答案 同样的元素不能被重用 有三种思路 第一个思路 遍历数组i从第一个数开始 j从 i 1 开始 直到找到合适的值 这个算法的时间复杂度为O n2 空间复杂
  • 【Docker实战】使用Docker部署Leantime项目管理系统

    Docker实战 使用Docker部署Leantime项目管理系统 一 Leantime 介绍 1 1 Leantime简介 1 2 Leantime特点 二 本地环境介绍 2 1 本地环境规划 2 2 本次实践介绍 三 本地环境检查 3
  • huggingface如何使用ssh命令,下载数据集或者模型 比如:git clone git@hf.co:openchat/openchat_8192

    今天抽空整理了一下笔记 linux服务器中 使用ssh下载huggingface模型或者数据集 1 访问huggingface个人主页 profile 里的settings https huggingface co settings pro
  • keil mdk 编译新建stm32工程时出现的弹窗错误:browse information of one or more files is not available及等其他莫名其妙的错误如何解决

    出现的错误如下图 等等一些其他莫名其妙的错误 网上找了很多的办法都没有解决 这些问题只是在新建一个工程的是否出现的 最后自己又重新看了一下如何新建工程的过程找到了最后的原因是少加了C C 的宏定义 USE STDPERIPH DRIVER
  • python—判断语句练习题05

    目录 1 题目 解2 2线性方程 使用克莱姆法则解下面的线性方程 2 题目 石头剪刀布小游戏 程序随机产生一个数字0 1和2来表示石头 剪刀 和布 程序提示用户输入数字0 1或2 然后显示一条信息表示用户或计算机的输赢情况 3 题目 编写册
  • MySQL生成千万测试数据

    目录 1 创建基础表结构 2 创建内存表 3 创建存储过程和函数 4 执行存储过程 5 遇到的问题 5 1 1449错误 5 2 1114错误 6 同步数据 1 创建基础表结构 CREATE TABLE t user id int 11 N
  • 自带浏览器_苹果手机自带浏览器下载的文件在哪里

    随着iOS13的发布 苹果在Safari浏览器中新增了 下载项 类似于Mac上的功能 可以帮助追踪当前正在下载的任何文件 并可以导航到下载的存储位置 苹果手机自带浏览器下载的文件在哪里 默认情况下 Safari浏览器的下载管理器将会把下载内
  • Ajax数据传递暨利用js进行表单数据回显

    问题一 Ajax传递整个表单数据 function createCustomer post pageContext request contextPath list add do new customer form serialize fu
  • PyQt5-布局

    布局 在qt里布局分四大类 QBoxLayout QGridLayout QFormLayout QStackedLayout QBoxLayout 直译为 盒子布局 一般使用它的两个子类QHBoxLayout 和 QVBoxLayout
  • AIX程序打包

    打包 首先需要安装打包工具mkinstallp 在AIX安装光盘中 安装bos adt insttools 安装过程中需要在放入光盘1 安装完成后 可以在 usr sbin 下找到mkinstallp AIX中一个package包含有多个f
  • 终于有人把 Docker 讲清楚了,别再说不会 Docker 了!(摘)

    富 Web 时代 应用变得越来越强大 与此同时也越来越复杂 集群部署 隔离环境 灰度发布以及动态扩容缺一不可 而容器化则成为中间的必要桥梁 本文我们就来探索一下 Docker 的神秘世界 从零到一掌握 Docker 的基本原理与实践操作 别
  • APT攻击是什么?面对APT攻击,我们应该怎么做?

    目录 一 概念 二 APT攻击特征 三 APT攻击技术 3 1 APT攻击方式 3 2 APT攻击诱饵种类 四 APT攻击模式 4 1 第一阶段 扫描探测 4 2 第二阶段 工具投送 4 3 第三阶段 漏洞利用 4 4 第四阶段 木马植入
  • 区块链学习笔记13——ETH以太坊概述

    区块链学习笔记13 ETH以太坊概述 学习视频 北京大学肖臻老师 区块链技术与应用 笔记参考 北京大学肖臻老师 区块链技术与应用 公开课系列笔记 目录导航页 比特币和以太坊是两种最主要的加密货币 比特币被称为区块链1 0 以太坊被称为区块链
  • 自动驾驶开发入门(三)---浅谈Apollo Cyber RT中的Transport

    Cyber的Transport为上层封装了底层数据传输的细节 上层主要使用Transport Transmitter Receiver三个类 其中Transport是工厂类 负责创建Transmitter Receiver以及Dispatc
  • pyspark作为生产者发送消息(推送数据)到kafka

    pyspark作为生产者发送消息到kafka 网上大部分的案例都是pyspark作为消费者消费kafka的消息 但是作为生产者生产消息发送给kafka的很少 下面把pyspark如何创建数据 或读取数据 作为生产者发送消息给kafka作为案
  • C++字节对齐

    系统让程序中的变量按字节对齐的目的 访问高效 字节是内存空间分配的最小单位 在程序中 我们定义的变量可以放在任何位置 但实际情况是访问特定类型变量的时候在特定的内存地址访问 这就需要各种类型数据按照一定的规则在空间排列 而不是顺序的一个接着
  • 两台文件服务器,负载均衡,用两台云服务器搭建一个负载均衡

    用两台云服务器搭建一个负载均衡 内容精选 换一换 弹性负载均衡 Elastic Load Balance 以下简称ELB 通过将访问流量自动分发到多台弹性云服务器 扩展应用系统对外的服务能力 实现更高水平的应用程序容错性能 用户通过基于浏览
  • 顺序表的C语言实现(静态/动态)

    目录 1 顺序表的定义 2 顺序表的实现 静态分配 3 顺序表的实现 动态分配 1 顺序表的定义 线性表的顺序存储又称顺序表 它是用一组地址连续的存储单元依次存储线性表中的数据元素 使得逻辑上相邻的两个元素在物理位置上也相邻 因此 顺序表的
  • C++基础知识 - 浮点类型

    需要精确计算的数学 工程应用 用整数类型不合适 float类型 单精度浮点类型 用来存储带小数部分的数据 在内存中占用4个字节 表示范围 3 4 1038 3 4 1038 不需记忆 精度 最长7位有效数字 是指7位10进制位 精度只能取值
  • 【Android】常用对话框大全(二)Material Dialog

    前言 上一篇文章中 谈到本系列的文章将讲解Android dialog Material dialog 为何要谈论Material呢 开发过Flutter的开发者也许就会明白 Material Design框架Flutter也在用 而在其官