Android Dialog和PopWindow的使用
弹窗在安卓开发中是必不可缺的一部分,通知,余额不足提示,第三方SDK的跳转,一些条件筛选的弹窗等等,在Android中,最常用的一般是Dialog和PopWindow这俩个控件。
自己平时也用得多,今天就把这个基础的东西总结下。
其实这俩个控件有一些实现和展示上的区别,不过也可以通过代码使得展示上大差不差
PopupWindow
为非模态,可以继续操作弹出界面之下的控件;Dialog
为模态,必须先取消Dialog才能操作Dialog之下的控件;两者最根本的区别在于有没有新建一个 Window
,PopupWindow 没有新建,而是通过 WMS 将 View 加到 DecorView;Dialog 是新建了一个 window (PhoneWindow),相当于走了一遍 Activity 中创建 window 的流程。
一、Dialog
1、AlertDialog
AlertDialog是Dialog的子类,所以它包含了Dialog类的很多属性和方法。
他的实现非常简单:
val dialog1: AlertDialog.Builder = AlertDialog.Builder(this);
dialog1.setTitle("提示").setMessage("你的金额不足!").setNegativeButton("关闭", null).create().show();
展示为:
具体可以设置其属性的方法:
setTitle :为对话框设置标题
setIcon :为对话框设置图标
setMessage:为对话框设置内容
setView : 给对话框设置自定义样式
setItems :设置对话框要显示的一个list,一般用于显示几个命令时
setMultiChoiceItems :用来设置对话框显示一系列的复选框setPositiveButton :给对话框添加"Yes"按钮
setNegativeButton :对话框添加"No"按钮
create : 创建对话框
show :显示对话框
2、Dialog
直接上代码:
1.首先new 一个Dialog,第二个属性是为其配置一些dialog属性,例如背景,show()/dismiss()动画,是否有标题等等
2.inflate一个布局文件,再通过 dialog.setContentView(localView) 设置其展示的自定义布局
3.获取到dialog的window,通过window设置其布局的属性,长宽自适应,展示的位置等等
4.为弹窗布局里的控件赋值啊,添加点击事件等等,我这儿是一个弹窗展示下载进度,进度懒得写,就为图片和按钮增加了点击事件。
5.dialog.show()展示就完事
val dialog = Dialog(this, R.style.jz_style_dialog_progress) //设置一些属性val localView = LayoutInflater.from(this).inflate(R.layout.common_global_volume_dialog, null) //设置自定义的弹窗UIdialog.setContentView(localView)val window = dialog.windowwindow?.setLayout(-2, -2) //-2 其实就是WRAP_CONTENTval localLayoutParams = window?.attributeslocalLayoutParams?.gravity = Gravity.BOTTOMwindow?.attributes = localLayoutParamsval imageV: AppCompatImageView = dialog.findViewById(R.id.volume_image_tip)val cancelTv = dialog.findViewById<AppCompatTextView>(R.id.volume_tv_cancel)val confirmTv = dialog.findViewById<AppCompatTextView>(R.id.volume_tv_confirm)imageV.setOnClickListener {dialog.dismiss()}cancelTv.setOnClickListener {Toast.makeText(it.context, "Cancel", Toast.LENGTH_SHORT).show()dialog.dismiss()}confirmTv.setOnClickListener {Toast.makeText(it.context, "Confirm", Toast.LENGTH_LONG).show()dialog.dismiss()}dialog.show() //展示弹窗
展示效果:
1、当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略.
2、当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略.
3、当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略.
4、当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略.
5、当参数值包含Gravity.CENTER_HORIZONTAL时
对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动.
6、当参数值包含Gravity.CENTER_VERTICAL时
,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动.
7、gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL |
Gravity.CENTER_VERTICAL.
8、Dialogh距离边界都有一小段距离
二、popWindow
这是popwindow实例
package com.example.lxview.base.popimport android.annotation.SuppressLint
import android.graphics.drawable.ColorDrawable
import android.view.*
import android.widget.PopupWindow
import androidx.appcompat.widget.AppCompatTextView
import com.example.lxview.R@SuppressLint("InflateParams")
class PickHistorySelectPop private constructor(v: View, val listener: (Int?) -> Unit?, private val focusAble: Boolean = true) {var popWindow: PopupWindow? = nullcompanion object {fun show(v: View, focusAble: Boolean? = true, listener: (Int?) -> Unit?): PickHistorySelectPop {return PickHistorySelectPop(v, listener, focusAble ?: true)}}private lateinit var replied: AppCompatTextViewprivate lateinit var reply: AppCompatTextViewprivate lateinit var refused: AppCompatTextViewprivate lateinit var all: AppCompatTextViewinit {show(v, listener)}enum class SelectType(val type: Int) {REPLIED(1), NO_REPLY(0), REFUSED(3), ALL(-1)}private fun show(v: View, onResult: (Int?) -> Unit?) {popWindow = PopupWindow(v.context)val view = View.inflate(v.context, R.layout.select_pop_content, null)popWindow?.contentView = viewreplied = view.findViewById(R.id.pick_history_filter_replied)reply = view.findViewById(R.id.pick_history_filter_no_reply)refused = view.findViewById(R.id.pick_history_filter_refused)all = view.findViewById(R.id.pick_history_filter_all)popWindow?.setBackgroundDrawable(ColorDrawable())popWindow?.isOutsideTouchable = truepopWindow?.isTouchable = truepopWindow?.isFocusable = truereplied.setOnClickListener {onResult(SelectType.REPLIED.type)popWindow?.dismiss()}reply.setOnClickListener {onResult(SelectType.NO_REPLY.type)popWindow?.dismiss()}refused.setOnClickListener {onResult(SelectType.REFUSED.type)popWindow?.dismiss()}all.setOnClickListener {onResult(SelectType.ALL.type)popWindow?.dismiss()}popWindow?.showAtLocation(v, Gravity.END or Gravity.TOP, 50, 200)}}
调用的地方:
easyPopTv?.setOnClickListener {PickHistorySelectPop.show(it, true) { type ->when (type) {0 -> {Toast.makeText(it.context, "只展示未回复的", Toast.LENGTH_LONG).show()}1 -> {Toast.makeText(it.context, "只展示已回复的", Toast.LENGTH_LONG).show()}3 -> {Toast.makeText(it.context, "只展示拒绝的", Toast.LENGTH_LONG).show()}else -> {Toast.makeText(it.context, "展示所有问答", Toast.LENGTH_LONG).show()}}}}
展示效果:
这个弹窗,因为要实现多语言,所以宽度不定,我用的是ninePatch来实现的宽度拉伸,这个用于项目里右上角点击图标对展示内容进行筛选。
- showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移。
- showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移。
- showAtLocation(View parent, int gravity, int x, int y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移。
三、细节上的区别
(1)Popupwindow在显示之前一定要设置宽高,Dialog无此限制。
(2)Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会消失。
(3)Popupwindow不会给页面其他的部分添加蒙层,而Dialog会。
(4)Popupwindow没有标题,Dialog默认有标题,可以通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消标题,第二个dialog实例我就是通过在style里面设置其没得标题。
(5)二者显示的时候都要设置Gravity。如果不设置,Dialog默认是Gravity.CENTER。
(6)二者都有默认的背景,都可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。
通过Dialog和popWindow,可以实现各种各样的效果,什么全局加载loading,五花八门的分享弹窗等等,具体选择实现可以根据需求而定。如果用的地方比较多,可以进行简单的封装,只需要简单的传入布局文件,点击事件,内容,通过几行代码便可以实现好看的弹窗功能。
当然,更简单且不需要交互的提示只需要用Toast就可以展示了。
因为想着简单明了的说明dialog和popwindow,所以几个样例都是很简单的实现。还有些自定义的弹窗在下面的Demo里
关于这部分的源码:https://github.com/LiXiang1996/LxViewhttps://github.com/LiXiang1996/LxView
慢慢补充吧,准备这个项目里把一些基础功能的实现全部弄一下,目前还很丑,慢慢优化吧~
Android Dialog和PopWindow的使用相关推荐
- Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析
[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...
- Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析
1 背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与LayoutInflater加载解析机制源码分析>, 然后有人在文章下面评论和微博 ...
- (转) Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析
转载[工匠若水 http://blog.csdn.net/yanbober ] 1 背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与Layou ...
- android 开发零起步学习笔记(二十二):ANDROID应用ACTIVITY、DIALOG、POPWINDOW、TOAST窗口添加机制及源码分析(一)
原文:http://www.cnblogs.com/shanzei/p/4654817.html 第一部分: ANDROID应用ACTIVITY.DIALOG.POPWINDOW.TOAST窗口添加机 ...
- Android --- Dialog 中 Dismiss 和 Cancel 的解释
Android Dialog有两个很相似的方法: Dialog.cancel()和Dialog.dismiss(); 这两个方法区别在于: 1.Dialog.cancel()方法中会调用Dialog. ...
- 7种形式的Android Dialog使用举例
在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一 ...
- android dialog隐藏虚拟按键,Android应用开发之Android dialog 去除虚拟按键的解决方法...
本文将带你了解Android应用开发Android dialog 去除虚拟按键的解决方法,希望本文对大家学Android有所帮助. Android 部分机型没有物理按键,只有虚拟按键,Activi ...
- android dialog去掉标题栏和边框
android Dialog去掉标题栏 和边框 首先在 values/Style.xml文件中加入以下代码(如果没有该文件就创建一个XML名为Style.xml) <!--重写系统弹出Dialo ...
- android的自定义dialog样式,如何自定义Android Dialog的样式?
如何自定义Android Dialog的样式?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如何自定义Android ...
- android dialog 详解,详解android dialog自定义实例
现在很多应用程序的提示对话框都很有个性的,如果你使用的对话框样子还是传统的对话框,是不是有点LOST了呢?今天爱站技术频道小编就给大家讲讲详解android dialog自定义实例. 第一个需求:简单 ...
最新文章
- 我国数字出版发展尚存三大难题
- 【BZOJ 2351】Matrix(Hash)
- 全排列两种实现方式(java)—poj2718
- AIX卷管理介绍以及利用空闲PP来创建文件系统
- 三分钟了解 Python3 的异步 Web 框架 FastAPI
- 求字符串里面数字之和
- A→CALL→B时防止B程序COMMIT掉A程序文件的方法
- Oracle学习笔记:通过种子数据库设置dbid为指定值
- 通过日志恢复oracle序列,(存档日志包含序列84,要求序列36)怎么恢复啊?
- 搜索引擎广告计费系统如何防恶意点击
- 将数组的列表结构转成树结构
- 手把手教你在Linux上安装CUDA9.0(以及如何避开所有的坑)
- _beginthread
- 不透明度16进制值对照表
- eda交通灯控制器波形输入_EDA交通灯控制器设计
- 优秀的前端开发工程师需要哪些技能?
- win10共享文件夹“您没有权限访问,请与网络管理员联系请求访问权限”解决方案
- 基于matlab的2psk功率,基于matlab的相移键控系统仿真.doc
- 目录——Java趣味编程100例
- 建tcode維護自己創建的數據表(SE54/SM30)