Android之Dialog分析

article/2025/8/27 22:28:55

Android之Dialog分析

以Dialog为引导,Android的弹出式消息一共是三种(据我所知):Dialog,tocast,notification 其三种弹出式消息各有所长。今天重点是分析其中的Dialog。Android的Dialog是android界面编程的重点。当然android被称之为“页程序”就更体现页面编程,UI线程了解的重要性了。

本文的目录结构:

1、Android中的几种Dialog

2、Dialog的创建方式

3、Android的警告对话框AlertDialog

4、Android的进度框ProgressDialog

5、日期选择框& 时间选择框

6、对话框风格的窗口

7、popupwindow

 

创建对话框一般是出现在当前Activity之上的一个小窗口,此时Activity失去焦点,转由对话框接受用户的交互(触摸响应事件)

首先看一看Dialog的类图,由此可以更清晰的看到控件的属性继承关系


一、Android中的几种Dialog:

1、  自定义:Dialog

2、  警告框:AlertDialog

3、  进度框:ProgressDialog

4、  日期选择框:DatePickerDialog

5、  时间选择框:TimePickerDialog

Android的其他几种类似的窗口

1、  对话框风格的窗口

2、  Popupwindow


二、Dialog的创建方式总的来说是两种:

1、  直接new一个Dialog对象,然后调用Dialog对象的show()和dismiss()方法来控制对话框的显示和隐藏

2、  在Activity的onCreateDialog(intid)方法中创建Dialog对象并返回,然后调用Activity的showDialog(int id)和dismissDialog(int id)来显示和隐藏对话框

这两者的区别在于通过第二种方式创建的对话框会继承Activity的属性,并且Android系统会自动管理每个对话框的状态并将它们和Activity连接,这样当打开一个对话框时,Menu键会显示Activity的菜单,音量键会调整Activity当前使用的音频流的音量。同时第二种方式在Activity中有父类方法可实现:

onPrepareDialog(int, Dialog):如果希望每次显示对话框的时候有动态更改的内容,那么修改这个函数

onCreateDialog(int)当一个对话框第一次被请求时,Android调用这个方法,这是初始化对话框的地方,创建对话框之后,将返回被创建的对象

dismissDialog(int)二者的效果是一样的。

removeDialog(int)如果你使用onCreateDialog(int)来管理你的对话框的状态, 那么每次你的对话框被解除时, 该对话框对象的状态会被Activity保存. 如果你决定你不再需要这个对象或者需要清除对话框的状态, 那么你应该调用这个方法。这将把所有该对象的内部引用移除。


三、Android的警告对话框AlertDialog

其实警告对话框AlertDialog是作为Dialog的一个拓展,方便与应用各种固定模式的对话框中;确定的生成对话框,包括标题,内容,选项,按钮等的设置和响应等;这很方便,但是实际实现中却也有自己的短板:theme改变不了(貌似是固定的,比如想设置Dialog的背景色透明就不行,可能我还不会用全)。

下面介绍AlertDialog的基本用法:

AlertDialog生成的对话框可分为如下四个区域:

·生成对象 使用创建 AlertDialog.Builder对象

·图标区   调用AlertDialog.Builder的setIcon方法设置

·标题区   调用AlertDialog.Builder的setTitle()或setCustomTitle()方法设置标题

·内容区   调用AlertDialog.Builder的相关设置方法设置对话框内容

·按钮区 调用AlertDialog.Builder的setPositiveButton()、setNegativeButton() 或setNeutralButton()方法添加多个按钮。

调用AlterDialog.Builder的create()方法创建AlertDialog对象,再调用AlertDialog对象的show方法将该对话框显示出来。

以上的是AlertDialog的固定模式;


具体更改内容区的显示内容可达到不同的目的,AlertDialog提供如下六中方法来指定对话框的内容。

setMessage():设置对话框内容为简单的文本内容

setItems():设置对话框内容为简单列表项

setSingleChoiceItems():设置对话框内容为单选列表项

setMultiChoiceItems():设置对话框内容为多选列表项

setAdapter():设置对话框内容为自定义列表项

setView():设置对话框内容为自定义的View

以上的这六种对话框基本就是可以满足需要了,详细的实现可参考博文:http://www.oschina.net/question/54100_32486


四,Android的进度框ProgressDialog

一个ProgressDialog(进度对话框)是AlertDialog的扩展。它可以显示一个进度的动画——进度环或者进度条。这个对话框也可以提供按钮,例如取消一个下载等。

进度框Dialog是一个明显的直接面对进度框的Dialog,这样做是免除了自定义progress 的Dialog或是AlertDialog的复杂。

其具体实现有两种方式:

1、只是创建简单的进度对话框,调用ProgressDialog提供的静态show()方法显示对话框即可

2、是new ProgressDailog(this)获取对象,然后设置属性等


五、日期选择框 & 时间选择框

日期选择框(DatePickDialog)和时间选择框(TimePickerDialog)的使用是比较简单的,两个步骤:

1、 都是先new出DatePickDialog & TimePickerDialog实例,调用其show()方法即可显示出来。

2、 为其绑定监听器;设置事件监听器,从而获取用户设置的事件(时间& 日期)

在new出对象的同时,监听器是必须的

NewDtePickerDialog(this, new DatePickerDialog.OnDateSerListener(){…在实现方法中获取日期…});

NewTimerPickerDialog(this, new TimePcikerDialog.OnTimeSetListener(){…在实现方法中获取时间…});


六、对话框风格的窗口

其实本质上仍然是窗口,并不能算是Dialog;其本质上是Activity,只是将它做成了对话框风格而已。

这个是在Activity中配置相关theme主题就ok了。

<activityandroid:name=".ServerConfigDialogActivity"android:label="@string/app_name"
android:theme="@android:style/Theme.Dialog"><intent-filter><actionandroid:name="android.intent.action.MAIN"/>
<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>


七、popupwindow

Popupwindow也是可以创建类似对话框风格的窗口的,使用简单,两个步骤

1、 popupwindow的构造器创建popupwindow对象

2、 显示的方式有两种:

1、 作为某控件的下拉项:showAsDropDown(View v)

2、 指定位置展示:showAtLocation()在指定位置显示出来

(示例中的重点是点击外部事件的时候popupwindow会不会消失的问题,设置背景很重要)

packagecom.example.hellopopupwindow;importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.util.Log;
importandroid.view.LayoutInflater;
importandroid.view.MotionEvent;
importandroid.view.View;
import android.view.View.OnClickListener;
importandroid.view.View.OnTouchListener;
importandroid.view.ViewGroup.LayoutParams;
importandroid.widget.Button;
importandroid.widget.PopupWindow;
importandroid.widget.Toast;public classMainActivity extends Activity {private Context mContext = null;@Overrideprotected void onCreate(BundlesavedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = this;Button button = (Button)findViewById(R.id.button);button.setOnClickListener(newView.OnClickListener() {@Overridepublic void onClick(View view) {showPopupWindow(view);}});}private void showPopupWindow(View view) {// 一个自定义的布局,作为显示的内容View contentView =LayoutInflater.from(mContext).inflate(R.layout.pop_window, null);// 设置按钮的点击事件Button button = (Button) contentView.findViewById(R.id.button1);button.setOnClickListener(newOnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(mContext,"button is pressed",Toast.LENGTH_SHORT).show();}});final PopupWindow popupWindow = newPopupWindow(contentView,LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT, true);popupWindow.setTouchable(true);popupWindow.setTouchInterceptor(newOnTouchListener() {@Overridepublic boolean onTouch(View v,MotionEvent event) {Log.i("mengdd","onTouch : ");return false;// 这里如果返回true的话,touch事件将被拦截// 拦截后 PopupWindow的onTouchEvent不被调用,这样点击外部区域无法dismiss}});// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框// 我觉得这里是API的一个bugpopupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.selectmenu_bg_downward));// 设置好参数之后再showpopupWindow.showAsDropDown(view);}
}


 

 


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

相关文章

Android开发dialog内存泄露,Dialog引发的内存泄漏

8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 本文是本人对于 LeakCanary 团队的一篇分析内存泄漏的文章的意译。水平有限,如有不够准确之处,敬请包涵。 主旨:在Lollipop之前的版本,Dialog可能导致内存泄漏。 引言 LeakCanary 提示存在内…

android源码分析-Dialog

今天给大家介绍android -Dialog源码分析 Dialog 是所有对话框的基类&#xff0c;例如AlertDialog&#xff0c;我们要深入了解指导Dialog的用法&#xff0c;逻辑&#xff0c;必须要把Dilaog弄清楚&#xff0c;下面首先我们来看下Google对Dialog的类描述&#xff1a;/**Base clas…

Dialog源码分析

1, 概述 Dialog(对话框)不仅可以显示信息,还可以和Activity界面进行交互,这种交互是阻塞式的. 继承Dialog的类有好几种,主要以AlertDialog为例来分析一下具体的原理。 2 实现 Dialog依附于Activity来实现,一般在acitivty中显示,因为Dialog的交互是阻塞式的,所以最好另开一线…

爬虫为什么会使用到HTTP代理?

在进行网页爬虫的时候使用HTTP代理&#xff0c;可以进行匿名抓取网页信息&#xff0c;爬取大数据等使用方向。HTTP代理我们很了解&#xff0c;但是你有了解过HTTP协议是什么吗&#xff1f; HTTP协议即超文本传输协议&#xff0c;是Internet上信息传输时使用最为广泛的一种简单…

爬虫笔记——全局代理下的requests写法

当PC挂了全局代理的时候&#xff0c;如果你的requests还像下面写的话&#xff0c;大概率会报错&#xff1a; 正确的写法是&#xff1a;

抓包:Android不走代理的请求

测试用例 测试应用有两个按钮&#xff0c;分别用 HttpURLConnection 和 Okhttp3 请求 https://www.baidu.com/。注意&#xff1a;两个请求都加入了 Proxy.NO_PROXY。 //HttpURLConnection请求https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel13812371237 public …

python爬虫——selenium+chrome使用代理

先看下本文中的知识点&#xff1a; python selenium库安装chrome webdirver的下载安装seleniumchrome使用代理进阶学习 搭建开发环境&#xff1a; selenium库chrome webdirver谷歌浏览器 >7.9 PS&#xff1a;安装了的同学可以跳过了接着下一步&#xff0c;没安装的同学跟…

python 爬虫 客户端_python爬虫

爬虫简介 什么是爬虫&#xff1f; 爬虫&#xff1a;就是抓取网页数据的程序。 HTTP和HTTPS HTTP协议(HyperText Transfer Protocol&#xff0c;超文本传输协议)&#xff1a;是一种发布和接收 HTML页面的方法。 HTTPS(Hypertext Transfer Protocol over Secure Socket Layer)简单…

爬虫从入门到精通(7) | 常见反爬-代理IP的使用

目录 一、 为什么要使用代理IP&#xff1f; 二、代理IP的原理 三、代理IP的作用 四、代理IP的分类 ​ 1.根据代理的协议区分 2.根据匿名程度区分 五、在requests模块中如何设置代理 一、 为什么要使用代理IP&#xff1f; 使用自己本地的IP 利用爬虫技术获取某个网站信息的时…

爬虫手册06 代理池和代理服务器搭建

免费代理池的搭建 参考资料&#xff1a;Python3 网络爬虫开发实战&#xff08;第二版&#xff09; 一. 学习目标 &#xff1a; 参考《第9章 代理的使用》9.2节搭建自己私有的代理IP池。 二. 实验环境&#xff1a; 阿里云或腾讯云的服务器&#xff0c;我是在打折和新用户优…

我裂开了,教给他如何搭建和使用代理服务器,他居然用来做这么不正经的事(爬虫,代理ip)

代码是正经代码&#xff0c;但是程序员正不正经就不知道了。 ​ 前言 在使用爬虫对某些网站进行爬取时&#xff0c;为了不让网站发现我们的ip&#xff0c;模拟其他用户ip地址去访问网站。也就相当于间接的去访问网站&#xff0c;流程如图&#xff1a; 我们使用到代理服务器&…

Python爬虫进阶 - win和linux下selenium使用代理

目录 Windows selenium配置 下载地址 Chrome Chromedriver 版本对应关系 实践测试 操作元素 浏览器操作 获取元素信息 鼠标操作 实战demo selenium添加代理 Linux selenium配置 检查服务器环境 下载安装第三方库&#xff08;最简单版&#xff09; 实践测试 代码…

Python自助爬虫代理ip模块

短小无比的前言&#xff1a; 代理对于爬虫来说可是很重要的一环&#xff0c;尤其在对于大量数据的时候&#xff0c;一不小心自己ip挂了&#xff0c;要么你换网&#xff0c;要么你等个几小时恢复 之后你上网查阅了种种办法&#xff0c;跨越种种艰难险阻&#xff0c;数以堆计的bu…

python爬虫之requests库使用代理方式

在看这篇文章之前&#xff0c;需要大家掌握的知识技能&#xff1a; python基础html基础http状态码 让我们看看这篇文章中有哪些知识点&#xff1a; get方法post方法header参数&#xff0c;模拟用户data参数&#xff0c;提交数据proxies参数&#xff0c;使用代理进阶学习 安装…

爬虫代理IP哪家好?

前言 随着大数据时代的到来,爬虫已经成了获取数据的必不可少的方式,做过爬虫的想必都深有体会,爬取的时候莫名其妙 IP 就被网站封掉了,毕竟各大网站也不想自己的数据被轻易地爬走。 对于爬虫来说,为了解决封禁 IP 的问题,一个有效的方式就是使用代理,使用代理之后可以让…

Python爬虫基础-使用代理

为什么需要代理&#xff1f; 我们爬取数据的时候&#xff0c;开始可以正常爬取&#xff0c;但是过了一段时间&#xff0c;网站可能就会提示“您的IP访问频率过高”&#xff0c;然后就无法正常访问网站。 这是因为网站采取了反爬策略&#xff0c;某个ip访问频率超过一个阈值后&…

Python爬取代理IP

在一些网页的内容爬取过程中&#xff0c;有时候在单位时间内如果我们发送的请求次数过多&#xff0c;网站就可能会封掉我们的IP地址&#xff0c;这时候为了保证我们的爬虫的正常运行&#xff0c;我们就要使用代理IP。 下面来介绍如何构建自己的IP池。 我们用快代理来获取代理i…

流量数据分析的方法学习

1、看数字和趋势&#xff08;以电商网站为例&#xff09; 2、维度分解 3、用户分群&#xff08;又叫用户画像&#xff09; 4、转化漏斗 5、行为轨迹 关注行为轨迹&#xff0c;是为了真实了解用户行为。通过大数据手段&#xff0c;还原用户的行为轨迹&#xff0c;有助于增长团队…

恶意流量分析(一)

在分析恶意样本时&#xff0c;样本可能包含网络行为&#xff0c;比如样本从C2服务器上请求下载后续病毒文件。所以对于在病毒分析的角度&#xff0c;对恶意流量的分析也是不可避免的。在这里通过恶意流量习题&#xff08;malware-traffic-analysis&#xff09;对恶意流量进行入…

APP流量分析

分析参数 发送流量、接收流量 流量统计方法 抓包&#xff1a;干扰因素多&#xff0c;其他APP、安卓自带TCP收发长度统计功能 #找到包名 adb shell pm list packsges -3 #找到UID adb shell ps | grep <包名> #找到目录 adb shell cat /proc/9045<uid>/status #…