Android-对话框、通知

Toast类

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

1.使用静态方法创建

// 静态方法可以创建一个简单的Toast
public 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的偏移量

2.使用构造方法创建

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

// 初始化Toast
Toast toast = new Toast(this);
// 设置显示时间,可以选择Toast.LENGTH_LONG或者Toast.LENGTH_SHORT
toast.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承载该TextView
toast.setView(view);
// 显示Toast
toast.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的设置区域

image.png

区域1就是定义弹出框的头部信息,包括标题名或者一个图标:

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

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

setMessage: 为对话框设置内容,如果设置了其他内容,那么Message不要设置,否者只显示Message
setView:    给对话框设置自定义View
setItems:   设置对话框要显示的一个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_HORIZONTAL
public 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,或者震动

内容信息如下:


image.png

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

需要注意的是手机震动的时候,需要在mainifest.xml中加入权限:

设置flag位

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

常用字段

contentIntent 设置PendingIntent对象,点击时发送该Intent
defaults      添加默认效果
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,标记id
public 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();

你可能感兴趣的:(Android-对话框、通知)