弹窗在安卓开发中是必不可缺的一部分,通知,余额不足提示,第三方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的使用相关推荐

  1. Android应用Activity、Dialog、PopWindow、Toast窗体加入机制及源代码分析

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重劳动成果] 1 背景 之所以写这一篇博客的原因是由于之前有写过一篇<Android应用setCont ...

  2. Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析

    1  背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与LayoutInflater加载解析机制源码分析>, 然后有人在文章下面评论和微博 ...

  3. (转) Android应用Activity、Dialog、PopWindow、Toast窗口添加机制及源码分析

    转载[工匠若水 http://blog.csdn.net/yanbober ] 1 背景 之所以写这一篇博客的原因是因为之前有写过一篇<Android应用setContentView与Layou ...

  4. android 开发零起步学习笔记(二十二):ANDROID应用ACTIVITY、DIALOG、POPWINDOW、TOAST窗口添加机制及源码分析(一)

    原文:http://www.cnblogs.com/shanzei/p/4654817.html 第一部分: ANDROID应用ACTIVITY.DIALOG.POPWINDOW.TOAST窗口添加机 ...

  5. Android --- Dialog 中 Dismiss 和 Cancel 的解释

    Android Dialog有两个很相似的方法: Dialog.cancel()和Dialog.dismiss(); 这两个方法区别在于: 1.Dialog.cancel()方法中会调用Dialog. ...

  6. 7种形式的Android Dialog使用举例

    在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一 ...

  7. android dialog隐藏虚拟按键,Android应用开发之Android dialog 去除虚拟按键的解决方法...

    本文将带你了解Android应用开发Android dialog 去除虚拟按键的解决方法,希望本文对大家学Android有所帮助. Android   部分机型没有物理按键,只有虚拟按键,Activi ...

  8. android dialog去掉标题栏和边框

    android Dialog去掉标题栏 和边框 首先在 values/Style.xml文件中加入以下代码(如果没有该文件就创建一个XML名为Style.xml) <!--重写系统弹出Dialo ...

  9. android的自定义dialog样式,如何自定义Android Dialog的样式?

    如何自定义Android Dialog的样式?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如何自定义Android ...

  10. android dialog 详解,详解android dialog自定义实例

    现在很多应用程序的提示对话框都很有个性的,如果你使用的对话框样子还是传统的对话框,是不是有点LOST了呢?今天爱站技术频道小编就给大家讲讲详解android dialog自定义实例. 第一个需求:简单 ...

最新文章

  1. 我国数字出版发展尚存三大难题
  2. 【BZOJ 2351】Matrix(Hash)
  3. 全排列两种实现方式(java)—poj2718
  4. AIX卷管理介绍以及利用空闲PP来创建文件系统
  5. 三分钟了解 Python3 的异步 Web 框架 FastAPI
  6. 求字符串里面数字之和
  7. A→CALL→B时防止B程序COMMIT掉A程序文件的方法
  8. Oracle学习笔记:通过种子数据库设置dbid为指定值
  9. 通过日志恢复oracle序列,(存档日志包含序列84,要求序列36)怎么恢复啊?
  10. 搜索引擎广告计费系统如何防恶意点击
  11. 将数组的列表结构转成树结构
  12. 手把手教你在Linux上安装CUDA9.0(以及如何避开所有的坑)
  13. _beginthread
  14. 不透明度16进制值对照表
  15. eda交通灯控制器波形输入_EDA交通灯控制器设计
  16. 优秀的前端开发工程师需要哪些技能?
  17. win10共享文件夹“您没有权限访问,请与网络管理员联系请求访问权限”解决方案
  18. 基于matlab的2psk功率,基于matlab的相移键控系统仿真.doc
  19. 目录——Java趣味编程100例
  20. 建tcode維護自己創建的數據表(SE54/SM30)

热门文章

  1. python直方图规定化_OpenCV python 彩色图像的直方图规定化
  2. OPencv 灰度直方图、直方图规定化
  3. 【综合实训】图书管理系统——详细设计说明书
  4. Photoshop插件-证件照-白红蓝底-PS插件-脚本开发
  5. 927. 三等分(每日一难phase2--day26)
  6. flash动画转html5 效果,一键把SWF转HTML5 canvas动画的工具-Fanvas
  7. 网络安全课第二节 XSS漏洞检测防御
  8. Junit单元测试——如何正确测试异常
  9. 【长文预警】美团联合创始人王慧文清华产品课
  10. SSM框架常用jar包下载