在android中对于toast的显示一般有两种方法:

 Toast.makeText(Context, int, int).show();
 Toast.makeText(Context, CharSequence, int).show();

对于这两种方法第一个参数都是上下文(Context),第二个就是显示的内容,第三个是显示的时长,android给了我们时长的常量Toast.LENGTH_SHORT (2秒) Toast.LENGTH_LONG(3.5秒)
当你尝试在自定义时长时,如果设置得大于3500(ms)默认为LENGTH_LONG如果小于3500默认为LENGTH_SHORT所以,自定义时长都是心理安慰自己。什么?你不信?打开SDK文件夹查看下源码:在frameworks\base\services\java\com\android\server路径下有个NotificationManagerService.java的文件里面写到:

//这里定义了两个常量 private static final int LONG_DELAY = 3500; // 3.5 seconds    private static final int SHORT_DELAY = 2000; // 2 seconds   // 在下面的方法中调用要    private void scheduleTimeoutLocked(ToastRecord r, boolean immediate)    {        Message m = Message.obtain(mHandler, MESSAGE_TIMEOUT, r);        //三目运算符,要么是LONG_DELAY 要么是SHORT_DELAY所以只有这两种时间情况        long delay = immediate ? 0 : (r.duration == Toast.LENGTH_LONG ? LONG_DELAY : SHORT_DELAY);        mHandler.removeCallbacksAndMessages(r);        mHandler.sendMessageDelayed(m, delay);    }

这引发了一个问题,当我们同时显示多个toast时,就会出现时间的叠加问题,假设几乎同时显示3个设置为LENGTH_SHORT的toast那么就要耗时6秒显示完毕,而且用户体验特别不好,可能程序退出了,toast还没显示完成。那有什么方法可以解决这个时间叠加的问题呢?

/** * ============================================================================= * Copyright (c) 2016 yuxin All rights reserved. * Packname com.jju.yuxin.dierzhou * Created by yuxin. * Created time 2016/9/12 0012 上午 11:00. * Version   1.0; * Describe : 不会出现时间叠加的Toast * History: * ============================================================================== */public class ToastUtils {    private static Toast toast = null;    /**     * 判断toast是否存在,如果存在则更新text,达到避免出现时间叠加的问题     * @param context 上下文     * @param text  显示的内容     * @param duration  显示时长,默认值为Toast.LENGTH_SHORT (2秒)或Toast.LENGTH_LONG(3.5秒)     */    public static void toastShow(Context context, String text, int duration) {        if (toast == null) {            toast = Toast.makeText(context, text, duration);        } else {            toast.setText(text);        }        toast.show();    }    /**     * 判断toast是否存在,如果存在则更新text,达到避免出现时间叠加的问题     * @param context 上下文     * @param resId  字符串资源文件ID     * @param duration  显示时长,默认值为Toast.LENGTH_SHORT (2秒)或Toast.LENGTH_LONG(3.5秒)     */    public static void toastShow(Context context, int resId, int duration)            throws Resources.NotFoundException {        if (toast == null) {            toast = Toast.makeText(context, context.getResources().getText(resId), duration);        } else {            toast.setText(context.getResources().getText(resId));        }        toast.show();    }}

自己编写一个toast工具文件,尽可能保持原方法的传参类型,至于show()这个容易让人忘记的方法我们就在里面默认调用了,避免忘记!
代码中其中关键的就是 toast.setText()这个方法,我们看下官方文档怎么介绍这个方法

   /**     * Update the text in a Toast that was previously created using one of the makeText() methods.     * @param s The new text for the Toast.     */    public void setText(CharSequence s) {        if (mNextView == null) {            throw new RuntimeException("This Toast was not created with Toast.makeText()");        }        TextView tv = (TextView) mNextView.findViewById(com.android.internal.R.id.message);        if (tv == null) {            throw new RuntimeException("This Toast was not created with Toast.makeText()");        }        tv.setText(s);    }

利用已经创建的toast方法更新内容,这样就可以达到避免toast时间叠加的问题,只有最后一个toast才会完整的显示完指定时长。

参考博文:http://blog.csdn.net/zjbpku/article/details/7930764

我的博客网站:http://huyuxin.top/欢迎大家访问!评论!

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. Android在代码中设置drawableLeft(Right/Top/Bottom)
  5. layout_weight体验(实现按比例显示)
  6. 你不知道的Runnable接口,深度解析Runnable接口
  7. Android常用控件总结
  8. 关于Android(安卓)studio 使用fastjson报错的解决方法
  9. Android(安卓)之 日期选择器

随机推荐

  1. Android入门教程四十二之GridView(网格视
  2. Android学习与面试重点目录
  3. android junit (一)
  4. 自定义控件之View原理与使用
  5. android屏幕分辨率详解 ldpi mdpi hdpi
  6. Android(安卓)FrameLayout子view居中(左居
  7. android基础知识12:android自动化测试06—
  8. android设备连接到pc进行应用程序调试
  9. Android定义圆角背景方面的介绍
  10. android位图颜色模式的问题