简单好用的Toast封装类——EasyToast

我们用toast时不能设置显示的时间,而且不支持在线程中展示toast,下面我对原始的toast进行了封装,这样我们可以很方便的进行toast的使用了。

package com.kale.lib.utils;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.view.View;
import android.widget.Toast;

/**
 * @author Jack Tony
 * @date 2015/4/29
 */
public class EasyToast {

    @IntDef({Toast.LENGTH_SHORT, Toast.LENGTH_LONG})
    private @interface Length {}

    private Toast mToast = null;

    private Handler mHandler = null;

    private int duration = 0;

    private int currDuration = 0;

    private final int DEFAULT = 2000;

    public EasyToast(Context context) {
        currDuration = DEFAULT;
        mHandler = new Handler(context.getMainLooper());
        mToast = Toast.makeText(context, "", Toast.LENGTH_LONG);
    }

    private Runnable mToastThread = new Runnable() {

        public void run() {
            mToast.show();
            mHandler.postDelayed(mToastThread, DEFAULT);// 每隔2秒显示一次
            if (duration != 0) {
                if (currDuration <= duration) {
                    currDuration += DEFAULT;
                } else {
                    cancel();
                }
            }
        }
    };

    /**
     * 返回内部的toast对象。可以进行多样化的设置
     */
    public Toast getToast() {
        return mToast;
    }

    /**
     * 设置toast的文字
     */
    public void setText(String text) {
        mToast.setText(text);
    }

    /**
     * 显示toast
     *
     * @param duration toast显示的时间(单位:ms)
     */
    public void show(int duration) {
        this.duration = duration;
        mHandler.post(mToastThread);
    }

    /**
     * 设置toast显示的位置
     *
     * @param gravity 位置,可以是Gravity.CENTER等
     * @param xOffset x轴的偏移量
     * @param yOffset y轴的偏移量
     */
    public void setGravity(int gravity, int xOffset, int yOffset) {
        mToast.setGravity(gravity, xOffset, yOffset);
    }

    /**
     * 设置toast的view
     */
    public void setView(View view) {
        mToast.setView(view);
    }

    /**
     * 让toast消失的方法
     */
    public void cancel() {
        mHandler.removeCallbacks(mToastThread);// 先把显示线程删除
        mToast.cancel();// 把最后一个线程的显示效果cancel掉,就一了百了了
        currDuration = DEFAULT;
    }

    //// 封装的静态方法 //////

    public static void makeText(@NonNull Context context, int msg) {
        makeText(context, String.valueOf(msg));
    }

    public static void makeText(@NonNull Context context, String msg) {
        if (context != null) {
            Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
        }
    }

    public static void makeText(@NonNull Context context, int msg, @Length int length) {
        makeText(context, String.valueOf(msg), length);
    }

    public static void makeText(@NonNull Context context, String msg, @Length int length) {
        if (length == Toast.LENGTH_SHORT || length == Toast.LENGTH_LONG) {
            if (context != null) {
                Toast.makeText(context, msg, length).show();
            }
        }
    }

    /**
     * 当你在线程中使用toast时,请使用这个方法
     */
    public static void makeTextInThread(@NonNull final Context context, int msg) {
        makeTextInThread(context, String.valueOf(msg));
    }

    /**
     * 当你在线程中使用toast时,请使用这个方法
     */
    public static void makeTextInThread(@NonNull Context context, String msg) {
        makeTextInThread(context, msg, Toast.LENGTH_SHORT);
    }

    /**
     * 当你在线程中使用toast时,请使用这个方法
     */
    public static void makeTextInThread(@NonNull Context context, int msg, @Length int length) {
        makeTextInThread(context, String.valueOf(msg), length);
    }

    public static void makeTextInThread(@NonNull final Context context, final String msg, @Length final int length) {
        new Thread() {
            @Override
            public void run() {
                Looper.prepare();//先移除
                Toast.makeText(context, msg, length).show();
                Looper.loop();// 进入loop中的循环,查看消息队列
            }
        }.start();
    }
}
时间: 2024-11-13 06:48:28

简单好用的Toast封装类——EasyToast的相关文章

android 开发之Toast

今天新学了几个方法,现在分享下 Toast 的用法. Toast的用法非常简单,首先介绍一下 Toast.Toast是我在写myClock的时候遇到的,发现这是个安卓系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户, 这些消息会在click一段时间后自动消失,并且不占用屏幕的空间.下面上代码: 第一:定义一个Toast的触法点,下面就实现一个button来做Toast触法点. activity_main.xml 1 <?xml version="1.0"

Android学习笔记(26):Toast提示信息框

Toast用于在界面上显示提示消息框,这个提示信息框会在一段时间后消失. 用Toast显示提示信息的步骤很简单: 1.调用Toast的构造方法或是makeText()静态方法创建一个Toast对象. 2.利用Toast的方法来设置该消息提示的格式等. 3.调用Toast的show()方法显示消息提示框. 想要显示复杂的消息提示框可以使用对话框,也可以使用Toast,方法是用Toast构造器创建实例,再调用setView()方法设置Toast上显示的View组件.

Android消息提示:AlertDialog、Toast、Notification的使用

主要介绍Android常用于消息提示的组件:ALertDialog.Toast.Notification的使用场景以及它们的基本用法,探讨一些高级主题,最后总结一些开发过程中常见的问题. 首先我们来对这三种消息提示机制来一个直观的认识,分别是AlertDialog Toast.Notification 接下来分别介绍这三种机制各自对应的使用场景和用法 AlertDialog 使用场景:AlertDialog在应用内的使用还是很常见的,常用于让用户做出某种选择,而这种选择一定是简单的交互,如果是复

Android之提示Toast

步骤: 设置监听事件步骤1.事件源,如按键 btn_simple2.事件 OnClick3.监听器new OnClickListener3.绑定事件源与事件 setOnClickListener(new OnClickListener() {} 布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.c

Android的Toast介绍-android学习之旅(三十六)

Toast简介 Toast是一个非常方便的消息提示框,会在桌面显示一个短暂的消息提示.有两个特点: 1.消息不会获得焦点. 2.过一段时间会自动消失. Toast的生成步骤 1.调用构造器或者静态方法makeText()来生成一个Toast. 2.调用Toast设置该消息的对其方式,页边距等. 3.调用Toast的show()方法将他显示出来. Toast大部分只能显示消息,如果要显示图片和图表等需要用setView()方法进行定制. 带图片的消息提示 demo package peng.liu

Toast 运行在主线程

因为toast的现实需要在activity的主线程才能正常工作,所以传统的线程不能使toast显示在actvity上,通过Handler可以使自定义线程运行于Ui主线程 前几次碰到这个问题,确实郁闷了很久... log -- java.lang.RuntimeException: Can't create handler inside thread that has not calledLooper.prepare() 解决办法很简单:        Looper.prepare(); Toas

安卓第一天笔记

安卓第一天笔记 1.移动通信的发展G--(generation) 1G:模拟制式 2G:GSM/CDMA 2.5G:GPRS 2.75G:EDGE 3G:WCDMA/CDMA2000/TD-SCDMA 3.5G/3.75G:HSDPA/HSUPA/HSDPA+ 4G:TD-LTE( Long term evolution)长期演进 GSM:9K -->GPRS:42K--> EDGE:172K -->WCDMA:364k -->HSDPA/HSUPA:14.4M -->HSD

Linux 下 Redis使用介绍

出自http://blog.csdn.net/ajun_studio/article/details/6698147 和http://www.oschina.net/question/12_18065?sort=time Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Python,Ruby,Erlang,PHP,Java客户端,使用很方便. Redis

java面试第五天

修饰符abstract:抽象的,定义框架不去实现,可以修饰类和方法 abstract修饰类: 会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型 抽象类就相当于一个类的半成品,需要子类继承并覆盖其中的抽象方法,这时子类才又创建实例的能力,如果子类没有实现父类的抽象方法,那么子类也要为抽象类. abstract修饰方法: 会使这个方法变成抽象方法,也就是只有声明而没有实现,实现部分以";"代替,需要子类继承实现. 抽象方法代表了某种标准,定