Android——对话框、通知

来源:互联网 发布:inpho软件中文说明 编辑:程序博客网 时间:2024/05/16 18:49

Toast类

Android中的Toast是一种简易的消息提示框。
Toast是一个包含用户点击消息。Toast类会帮助你创建和显示这些。
当视图显示给用户,在应用程序中显示为浮动。和Dialog不一样的是,它永远不会获得焦点,无法被点击。用户将可能是在中间键入别的东西。Toast类的思想就是尽量不引起人的注意,同时还向用户提供信息,希望他们看见。而且Toast显示时间有限,Toast会根据用户设置的是显示时间后自动消失。
使用这个类的最简单的方法是调用静态方法构造自己需要的一切,并返回一个新的Toast对象。

使用静态方法创建

//静态方法可以创建一个简单的Toastpublic static Toast makeText(Context context,CharSequence text,@Duration int duration)//context  代表上下文//text     代表你要显示的文本//duration 代表时间,一般使用常量,也可以使用毫秒数。            //LENGTH_SHORT 短            //LENGTH_LONG  长

示例:

//使用静态方法创建Toast toast = Toast.makeText(this,"你好,Toast",Toast.LENGTH_SHORT);//将Toast显示到屏幕上toast.show();

Toast的默认显示位置屏幕的下方,如果需要改变位置,那么可以调用Toast的公开方法

public void setGravity(int gravity,int xOffset,int yOffset)    //gravity 显示的位置,它是一个常量,来自于android.view.Gravity    //offset  代表想x,y的偏移量

使用构造方法创建

Toast也可以使用构造方法去创建,但是必须手动设置(setView)和显示时间(setDuration)。

//初始化ToastToast toast = new Toast(this);//设置显示时间,可以选择Toast.LENGTH_LONG或者Toast.LENGTH_SHORTtoast.setDuration(Toast.LENGTH_LONG);//承载一个TextView,用来显示文字TextView view = new TextView(this);//设置TextView的值view.setText("这是一个TextView提示");//设置TextView的布局view.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT)); //Toast承载该TextViewtoast.setView(view);//显示Toasttoast.show();

setView中虽然显示可以给定很复杂的界面,但是一般Toast只是为了显示一些不重要的信息,重要的信息一般是使用Dialog来提示用户

Toast的优点

  1. 没有焦点,它不能和用户进行任何的交互,只能显示
  2. 自动关闭,时间到了自动消失
  3. 自带淡入淡出的动画

Toast的缺点

  1. 排队。如果短时间多次弹出的信息,不要使用Toast。
  2. 显示不重要的信息,经常被忽略。

Dialog类

一个对话框一般是出现在当前的Activity上的一个小窗口。处于下面的Activity失去焦点,对话框接受所有用户的交互。对话框一般用于提示信息和当前应用程序直接相关的小功能。

Android API支持的对话框

  • 警告对话框(AlertDialog):一个可以有0到3个按钮,一个单选框或者复选框的列表的对话框。警告对话框可以创建大多数的交互界面。
  • 进度对话框(ProgressDialog):显示一个进度环或者一个进度条。由于它是AlertDialog的扩展,所以它也支持按钮。
  • 日期选择对话框(DatePickerDialog):让用户选择一个日期。
  • 时间选择对话框(TimePickerDialog):让用户选择一个时间。
    我们还可以自定义Dialog,创造一些我们自己喜欢的对话框。

警告对话框(AlertDialog)

AlertDialog是Dialog的一个直接子类,使用AlertDialog,我们可以显示一个标题,最多显示3个按钮操作,以及一组选择框或者是自己定义的弹出框。AlertDialog使用了Builder设计模式来创建对象

AlertDialog的设置区域

这里写图片描述
区域1就是定义弹出框的头部信息,包括标题名或者一个图标。

setTitle: 为对话框设置标题setIcon : 为对话框设置图标

区域2就是AlertDialog对话框content部分,在这里我们可以设置一些message信息,或者定义一组选择框,还可以定义我们自己的布局弹出框

setMessage: 为对话框设置内容,如果设置了其他内容,那么Message不要设置,否者只显示MessagesetView:    给对话框设置自定义ViewsetItems:   设置对话框要显示的一个list,一般用于显示几个命令时    //public Builder setItems(CharSequence[] items, final OnClickListener listener)    //items 是传入一个字符串数组,或者是R文件中的数组setSingleChoiceItems:  用来设置对话框显示一系列的单选按钮    //public Builder setSingleChioceItems(CharSequence[] items,int checkedItems,final OnClickListener listener)    //items 是传入一个字符串数组,或者是R文件中的数组    //checkeItems是一个boolean数组,代表列表中的所有项的初始勾选状态

区域3是Action Buttons部分,这里我们定义操作按钮。
在AlertDialog中,定义按钮都是通过 setXXXButton 方法来完成,其中一共有3种不同的Action Buttons可以选择:

setPositiveButton(CharSequence text,DialogInterface.OnClickListener listener)//这是一个相当Ok、确定的操作的按钮。setNegativeButton (CharSequence text, DialogInterface.OnClickListener listener)//这是一个相当于取消操作的按钮。setNeutralButton (CharSequence text, DialogInterface.OnClickListener listener)//这个是相当于一个忽略操作的按钮。

AlertDialog的监听事件

在AlertDialog的各种设置中,都会有DialogInterface.OnClickListener,比如按钮,内容区的items,单选按钮等,只有多选按钮是用了另一个监听DialogInterface.OnMultiChoiceClickListener。

public void onClick(DialogInterface dialog,int which)//dialog当前点击的dialog//which 哪一个?相当于position(按钮为-1,其他为position)//多选按钮监听public void onClick(DialogInterface dialog,int which,boolean isChecked);//which代表items,多选按钮中的序号//isChecked代表当前which是否被勾选

AlertDialog还支持ListAdapter的子类,我们可以传入各种ListAdapter的子类,来显示复杂的列表,当然直接使用 setView 也可以办到

public Builder setAdapter(final ListAdapter adapter, finalOnClickListener listener)

进度条对话框(ProgressDialog)

ProgressDialog是AlertDialog类的子类,可以为一个未定义进度的任务显示一个旋转轮形状的进度动画,或者为一个指定进度的任务显示一个进度条。它的用处非常广泛,在每次用户操作一个延迟的任务时,我们必须以进度对话框的形式告诉用户,否者用户并不知道操作已经开始,可能会多次操作同一个任务,并且有可能导致异常发生。

构造方法和常用方法

public ProgressDialog(Context context) //构造方法需要一个上下文public void setProgressStyle(int style)  //给定一个样式,带进度条和不带进度条的样式                            //可选值                            //STYLE_SPINER 默认,圆形,没有进度条的样式                            //STYLE_HORIZONTAL  给定进度条的样式public void setMax(int max) //设置进度最大值,需要给定STYLE_HORIZONTALpublic void setCancelable(boolean flag) //是否能用返回键关闭,true可以关闭,false不能关闭public void setNessage(CharSequence message) //设置一个消息public boolean isShowing() //判断Dialog是否显示public void dismiss()     //关闭对话框//ProgressDialog从AlertDialog中继承的常用方法setIcon和setTitile   //虽然ProgressDialog可以设置Button,但是我们一般都不会去使用它

日期与时间选择器对话框

DatePickerDialog与TimePickerDialog都继承AlerDialog,基本方法和DatePicker和TimePicker组件一样,只是需要调用Dialog的show方法显示。在构造方法里需要回调监听

public interface OnTimeChangeListener{    void onTimeChanged(TimePicker view,int hourOfDay,int minute);    //用户改变时间后的监听}public interface OnDataChangedListener{    void onDateChanged(DataPicker view,int year,int mothOfYear,int dayOfMonth);    //用户改变日期后的监听}

通知(Notification)

Notification是一种具有全局效果的通知,它展示在屏幕的顶端,首先会表现为一个图标的形式,当用户向下滑动的时候,展示出通知具体的内容。
它是一种让你的应用程序在没有开启情况下或在后台运行警示用户。它是看不见的程序组件(Broadcast Receiver,Service和不活跃的Activity)警示用户有需要注意的事件发生的最好途径。

状态栏和状态条

  • 状态条就是手机屏幕最上方的一个条形状的区域:
    在状态条有好多信息量,比如usb连接图标,手机信号图标,电池电量图标,时间图标等等;
  • 状态栏就是手从状态条滑下来的可以伸缩的view:
    在状态栏中一般有两类(使用FLAG_标记):
    (1)正在进行的程序
    (2)通知事件

大概来描述创建一个Notification传送信息有

  • 一个状态条图标
  • 在拉伸的状态栏窗口中显示带有大标题,小标题,图标的信息,并且有处理该点击事件:比如调用该程序的入口
  • 闪光,LED,或者震动

内容信息如下:
这里写图片描述

下面对Notification中的常量,字段,方法的简单介绍一下:
DEFAULT_ALL 使用所有默认值,比如声音,震动,闪屏等
DEFAULT_LIGHTS 使用默认闪光提示
DEFAULT_SOUNDS 使用默认提示音
DEFAULT_VIBRATE 使用默认手机震动

需要注意的是手机震动的时候,需要在mainifest.xml中加入权限:
<uses-permission android:name="android.permission.VIBRATE" />

设置flag位

FLAG_AUTO_CANCEL 该通知能被状态栏的清除按钮给清除掉FLAG_NO_CLEAR 该通知不能被状态栏的清除按钮给清除掉FLAG_ONGOING_EVENT 通知放置在正在运行FLAG_INSISTENT 是否一直进行,比如音乐一直播放,知道用户响应

常用字段:

contentIntent 设置PendingIntent对象,点击时发送该Intentdefaults      添加默认效果flags         设置flag位,例如FLAG_NO_CLEAR等icon          设置图标sound         设置声音tickerText    显示在状态栏中的文字when          发送此通知的时间戳

创建Notification

一个notification不必对上面所有的选项都进行设置,但有3项是必须的:

  • 小图标 setSmallIcon()
  • 内容标题 setContentTitle()
  • 内容 setContentText()

NotificationManager

通知一般通过NotificationManager服务来发送一个Notification对象来完
成,NotificationManager是一个重要的系统级服务,该对象位于应用程序的框架层中,应用
程序可以通过它像系统发送全局的通知。这个时候需要创建一个Notification对象,用于承载
通知的内容。

快速创建一个Notification的步骤简单可以分为以下四步:

  • 实例化一个Notification.Builder对象;
  • 调用builder的相关方法对notification进行上面提到的各种字段;
  • 调用builder.build()方法此方法返回一个notification对象。
  • 实例化一个NotificationManager对象;
  • 调用manager的notify方法。

更新和移除通知

在使用NotificationManager.notify()发送通知的时候,需要传递一个标识符,用于唯一标识这个通知。对于有些场景,并不是无限的添加新的通知,有时候需要更新原有通知的信息,这个时候可以重写构建Notification,而使用与之前通知相同标识符来发送通知,这个时候旧的通知就被被新的通知所取代,起到更新通知的效果。
对于一个通知,当展示在状态栏之后,但是使用过后,如何取消呢?Android为我们提供两种方式移除通知,一种是Notification自己维护,使用setAutoCancel()方法设置是否维护,传递一个boolean类型的数据。另外一种方式使用NotificationManager通知管理器对象来维护,它通过notify()发送通知的时候,指定的通知标识Id来操作通知,可以使用cancel(int)来移除一个指定的通知,也可以使用cancelAll()移除所有的通知。

NotificationManager常用

public void canceAll();//移除所有的通知(只是针对当前Context下的Notification)public void cancel(int id)//移除标记为id的通知(只是针对当前的Context下的所有Notification)public void notify(String tag,int id,Notification notification)//将通知加入状态栏,标签为tag,标记idpublic void notify(int id,Notification notification)

PendingIntent

对于一个通知而言,它显示的消息是有限的,一般仅用于提示一些概要信息。但是一般简短的消息,并不能表达需要告诉用户的全部内容,所以需要绑定一个意图,当用户点击通知的时候,调用一个意图展示出一个Activity用来显示详细的内容。而Notification中,并不使用常规的Intent去传递一个意图,而是使用PendingIntent。
根据字面意思就知道是延迟的intent,主要用来在某个事件完成后执行特定的Action。
PendingIntent包含了Intent及Context,所以就算Intent所属程序结束,PendingIntent依然有效,可以在其他程序中使用

常用在通知栏及短信发送系统中。
PendingIntent一般作为参数传给某个实例,在该实例完成某个操作后自动执行PendingIntent上的Action,也可以通过PendingIntent的send函数手动执行,并可以在send函数中设置OnFinished表示send成功后执行的动作。
PendingIntent提供了多个静态的getXxx()方法,用于获得适用于不同场景的PendingIntent对象。一般需要传递的几个参数都很常规,只介绍一个flag参数,用于标识PendingIntent的构造选择:

FLAG_CANCEL_CURRENT: 如果构建的PendingIntent已经存在,则取消前一个,重新构建一个。FLAG_NO_CREATE:      如果前一个PendingIntent已经不存在了,将不再构建它 .FLAG_ONE_SHOT:       表明这里构建的PendingIntent只能使用一次FLAG_UPDATE_CURRENT: 如果构建的PendingIntent已经存在,则替换它,常用。

Intent和PendingIntent的区别

  • Intent是立即使用的,而PendingIntent可以等到事件发生后触发,PendingIntent可以cancel
  • Intent在程序结束后即终止,而PendingIntent在程序结束后依然有效
  • PendingIntent自带Context,而Intent需要在某个Context内运行
  • Intent在原task中运行,PendingIntent在新的task中运行

自定义布局notification

自定义布局notification
和Toast一样,通知也可以使用自定义的XML来自定义样式,但是对于通知而言,因为它的全局性,并不能简单的通过inflate膨胀出一个View,因为可能触发通知的时候,响应的App已经关闭,无法获取当指定的XML布局文件。所以需要使用单独的一个RemoteViews类来操作

RemoteViews类

RemoteViews 类描述了一个View对象能够显示在其他进程中,可以融合从一个layout资源文件实现布局。

实例化一个RemoteViews

//构造方法RemoteViews(String packageName, int layoutId)//通过指定的布局文件新建一个RemoteViews对象。

监听事件

public void setOnClickPendingIntent (int viewId, PendingIntent pendingIntent)//相当于调用View.OnClickListener启动准备好的PendingIntent。当在集合中设置条目的onClick动作时不起作用。//viewId       当点击时将要触发PendingIntent的视图的id//pendingIntent 当点击时传过去的PendingIntent

最后使用Notification.Builder.setContent(RemoteViews)方法设置它到一个Notification中。

示例

发送一条带有TextView的通知:
//创建一个RemoteView视图
RemoteViews contentView = new RemoteViews(getPackageName(),android.R.layout.simple_list_item_1);
//设置布局中的TextView为红色,并设置文字。
contentView.setTextViewText(android.R.id.text1, “测试”);
contentView.setTextColor(android.R.id.text1, Color.RED);
Notification notify = new Notification.Builder(this).setSmallIcon(R.drawable.ic_launcher)
.setContent(contentView)
.setTicker(“标题”).build();

原创粉丝点击