Android自带的Toast

Android Toast实现了一个简单的消息提示框功能。虽然其功能简单,但非常好用,只需要一行代码就可以完成提示信息的显示,自动消除。还可以指定显示的位置,显示的时间长短等。基本上不需要和用户交互的提示消息都可以用Toast来实现。
Toast的用法很简单,调用Toast类的静态方法makeText()创建一个Toast,然后再show()即可。例如

Toast.makeText(this, "This is a toast!", Toast.LENGTH_SHORT).show();

执行后就会在屏幕靠近下方的位置显示一个提示消息框。

Toast的一些不足之处

Toast虽然好用,但也有一些不足的地方。

1 界面不美观,表现不一致

默认Toast界面不是很美观,而且不同Android版本的表现也会有差异。此外,各大设备厂家似乎也意思到这一点,都喜欢在自家的ROM中对Toast的界面做不同的修改,这导致同一个Toast消息在不同设备上的表现千差万别。
这里给出了同一个Toast消息在一些设备上的显示效果。
Android2.3系统
Android4.2系统
Android4.4系统
Android5.0系统

2 重复提示

Toast的提示消息通常由用户操作触发,如果用户快速执行同一个操作,就会产生一系列的Toast消息。Android系统会维护一个Toast的消息队列,当一个Toast消息被创建后,它就会被添加到消息队列中等待系统处理。只有前一个Toast提示消失后,系统才会处理队列中下一个消息。所以,如果有一系列的Toast消息被添加到队列中,系统就需要较长的时间才能处理完毕,很可能应用的界面都已经被关闭了,Toast消息还在不停的冒出来。

3 显示时间无法自由控制

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界面不美观,且显示效果不一致的问题,可以通过自定义布局来实现界面的美化和统一。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类

创建一个自定义的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类方法也非常简单,只需要将原先的Toast改为MyToast即可。

MyToast.makeText(this, "This is a toast!", Toast.LENGTH_SHORT).show();

使用上述例子中的布局效果见下图。
白色背景下的效果
有图片背景下的效果

更多相关文章

  1. Android之实现RTL的ViewPager
  2. 经过两天的努力,终于写出了第一个android的helloword
  3. [Android开发]Android中的消息机制
  4. (4.1.19)【Android(安卓)UI设计与开发】第06期:底部菜单栏(一)使用Tab
  5. android开发中实现个性化ListView的一些概念和思路
  6. Android06之RecyclerView详解
  7. Android中消息处理机制研究
  8. Android布局管理器详解
  9. 一步步实现 仿制Android(安卓)LOL多玩盒子(四) 自定义AlertDialo

随机推荐

  1. Android中自定义属性基本步骤
  2. 2013.12.23 ——— android assents文件
  3. 【Java/Android性能优 6】Android(安卓)
  4. Android中Fragment的Arguments
  5. Android在SD卡上的文件读写
  6. Android(安卓)Studio 在活动中使用Toast
  7. Android widget使用
  8. Total Commander 公测第三版发布[Android
  9. 01.Android相关术语
  10. Android中Bitmap和Drawable互相转化