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的优点
- 没有焦点,它不能和用户进行任何的交互,只能显示;
- 自动关闭,时间到了自动消失;
- 自带淡入淡出的动画。
Toast的缺点
- 排队,如果短时间要多次弹出的信息,建议不要使用Toast。
- 显示不重要的信息,经常被忽略。
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不要设置,否者只显示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,或者震动
内容信息如下:
下面对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();