Android Toast实现了一个简单的消息提示框功能。虽然其功能简单,但非常好用,只需要一行代码就可以完成提示信息的显示,自动消除。还可以指定显示的位置,显示的时间长短等。基本上不需要和用户交互的提示消息都可以用Toast来实现。
Toast的用法很简单,调用Toast类的静态方法makeText()创建一个Toast,然后再show()即可。例如
Toast.makeText(this, "This is a toast!", Toast.LENGTH_SHORT).show();
执行后就会在屏幕靠近下方的位置显示一个提示消息框。
Toast虽然好用,但也有一些不足的地方。
默认Toast界面不是很美观,而且不同Android版本的表现也会有差异。此外,各大设备厂家似乎也意思到这一点,都喜欢在自家的ROM中对Toast的界面做不同的修改,这导致同一个Toast消息在不同设备上的表现千差万别。
这里给出了同一个Toast消息在一些设备上的显示效果。
Android2.3系统
Android4.2系统
Android4.4系统
Android5.0系统
Toast的提示消息通常由用户操作触发,如果用户快速执行同一个操作,就会产生一系列的Toast消息。Android系统会维护一个Toast的消息队列,当一个Toast消息被创建后,它就会被添加到消息队列中等待系统处理。只有前一个Toast提示消失后,系统才会处理队列中下一个消息。所以,如果有一系列的Toast消息被添加到队列中,系统就需要较长的时间才能处理完毕,很可能应用的界面都已经被关闭了,Toast消息还在不停的冒出来。
Toast只允许设置两种不同的消息显示时间,当使用Toast.makeText()或setDuration()设置消息显示的持续时间时,传入Toast.LENGTH_SHORT会显示2秒,传入Toast.LENGTH_LONG会显示3.5秒(2秒和3.5秒是Android原生系统中设置的时间,可能部分定制的ROM会修改这个时间),传入其他的数值都会按照2秒时间来显示。应用无法自由控制Toast的显示时间。
不过这对应用来说,可能并非是一个缺点,由于只有两种时间的设置,调用时就不需要纠结到底要显示多少时间才合适,反而简化了操作。一般来说Toast的这两种时间已经可以满足需要。短时间为2秒,如果显示时间小于2秒,就是一闪而过,所以基本也不会使用。长时间有3.5秒,作为不需要交互的提示消息,时间也是足够长了,太长了反而会影响用户体验。虽然有些场景下需要让提示消息长时间显示,例如需要提示消息一直显示,不自动消失,等待后台代码处理完毕后再由代码去控制其关闭。对这类场景,可能用其他的实现方式,如对话框,PopupWindow,WindowManager或者专门的Loading界面来实现更合适。
对Toast界面不美观,且显示效果不一致的问题,可以通过自定义布局来实现界面的美化和统一。Toast自定义布局实现步骤如下。
根据要实现的效果,创建自定义的布局文件。这里给出一个简单的只有一个TextView和加了背景透明效果的布局文件。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#B2000000" android:gravity="center" android:orientation="vertical" android:paddingBottom="8dp" android:paddingLeft="30dp" android:paddingRight="30dp" android:paddingTop="8dp" >
<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/white" />
</LinearLayout>
创建一个自定义的Toast类MyToast,类的实现非常简单,就参照Toast类,定义一个makeText()的静态方法和show()方法即可。在makeText()方法内,通过Toast类的setView()方法来为其设置自定义的布局。Toast类的其他方法,如setGravity()可以根据需要来添加。代码如下。
public class MyToast {
private Toast mToast;
private MyToast(Context context, CharSequence text, int duration) {
LayoutInflater inflate = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(R.layout.toast, null);
TextView textView = (TextView) v.findViewById(R.id.textView1);
textView.setText(text);
mToast = new Toast(context);
mToast.setDuration(duration);
mToast.setView(v);
}
public static MyToast makeText(Context context, CharSequence text, int duration) {
return new MyToast(context, text, duration);
}
public void show() {
if (mToast != null) {
mToast.show();
}
}
public void setGravity(int gravity, int xOffset, int yOffset) {
if (mToast != null) {
mToast.setGravity(gravity, xOffset, yOffset);
}
}
}
使用自定义的Toast类方法也非常简单,只需要将原先的Toast改为MyToast即可。
MyToast.makeText(this, "This is a toast!", Toast.LENGTH_SHORT).show();