自定义一个可以即时显示的Toast的工具类库

1 AppToast介绍

1.1 实现方式

全局只有一个Toast实例,每次调用show()方法显示Toast前都要先取消上次的Toast显示,然后显示本次的消息。

首先创建一个名为AppToast的类,在里面定义一个全局静态Toast对象和一个全局Application对象的弱引用。

private static Toast toast = null;  // Global Toast
private static WeakReference<Application> app;

定义一个init()方法,用于得到用户传入的Application实例。

public static void init(Application application) {
    app = new WeakReference<Application>(application);
}

封装showToast()方法,方便调用。

/**
 * Display Toast
 *
 * @param resId The resource id of the string resource to use.  Can be formatted text.
 */
public static void showToast(@StringRes int resId) {
    if (toast != null) {
        toast.cancel();
        toast = null;
    }
    toast = Toast.makeText(app.get(), resId, LENGTH_SHORT);
    toast.show();
}

也可以封装一个getToast()方法用于得到Toast实例,允许我们设置其属性,便于自定义Toast显示的效果。

/**
 * Get a Toast object <br>
 * Need to call show() method to be displayed
 *
 * @return Toast object.
 */
public static Toast getToast() {
    if (toast != null) {
        toast.cancel();
        toast = null;
    }
    toast = Toast.makeText(app.get(), "", Toast.LENGTH_SHORT);
    return toast;
}

1.2 使用方法

首先创建一个类继承自Application,在其onCreate()方法中调用我们之前写的init()方法进行AppToast类的初始化。

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化AppToast库
        AppToast.init(this);
    }
}

注意:不要忘记在AndroidManifest.xml文件中的application节点下配置android:name属性。

<application
    ...
    android:name=".MyApplication" >
    <activity android:name=".MainActivity" >
        ...
    </activity>
</application>

之后就可以在代码中进行使用了,比如:

AppToast.showToast(R.string.toast2);

Toast toast = AppToast.getToast();
toast.setGravity(Gravity.TOP | Gravity.CENTER, 0, 0);
toast.setText("自定义Toast");
toast.setDuration(Toast.LENGTH_SHORT);
toast.show();

显示效果如下图:


显示效果

开源库、样例工程、详细文档下载地址:
liying2008/ApplicationToast

该库已上传至jcenter仓库,使用Android Studio可以通过在线依赖引用的方式引入该库。

dependencies {
  compile 'cc.duduhuo.applicationtoast:applicationtoast:0.3'
}

2 CusToast介绍

2.1 功能介绍

CusToast是一个具有即时显示并且内置了10种样式的Toast工具库,现在简单介绍其实现原理。
在CusToast类中定义了一个枚举类型Style,即Toast显示的样式。

public enum Style {
    DEFAULT,
    LIGHT_BLUE,
    BLUE,
    LIGHT_RED,
    RED,
    LIGHT_GREEN,
    GREEN,
    LIGHT_YELLOW,
    YELLOW,
    GRAY_1
}

为了方便对Toast对象进行操作,我们创建一个自定义的Toast类,其继承自Toast,方便我们扩展Toast的功能,比如显示带图片的Toast和显示带副标题的Toast。
通过向DToast类的setView()方法传入样式名,得到不同样式的DToast

/**
 * Add a view to CusToast.
 *
 * @param application this application.
 * @param style       the style of CusToast.
 * @return current instance.
 */
public DToast setView(Application application, CusToast.Style style) {
    dView = View.inflate(application, R.layout.ddh_cus_toast, null);
    dText = (TextView) dView.findViewById(R.id.dText);
    setStyle(style);
    super.setView(dView);
    return this;
}

其余方法和布局文件请参考文末链接。

CusToast类中的showToast()方法如下所示。

/**
 * Display Toast.
 *
 * @param text The resource id of the string resource to use.  Can be formatted text.
 */
public static void showToast(@StringRes int text) {
    clearToast();
    toast = new DToast(app.get());
    toast.setView(app.get(), defStyle);
    toast.setText(text);
    toast.setDuration(Toast.LENGTH_SHORT);
    toast.show();
}

clearToast()方法如下,目的就是立即取消正在显示的“旧”Toast。

/**
 * Clear an existing CusToast.
 */
private static void clearToast() {
    if (toast != null) {
        toast.cancel();
        toast = null;
    }
}

2.2 使用方法

首先,和AppToast一样,在自己项目的Application类中初始化CusToast库,方法也和AppToast类似。

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化CusToast库(两种方式选其一)
        // 方式1:初始化同时指定CusToast的默认显示样式
        CusToast.init(this, CusToast.Style.RED);
        // 方式2:初始化,使用默认显示样式
        // CusToast.init(this);
    }
}

之后就可以在代码中进行使用了,比如:

CusToast.showToast("Toast 1");
CusToast.showToast("Toast 3", Toast.LENGTH_LONG, CusToast.Style.LIGHT_RED);
DToast toast = CusToast.getToast("自定义Toast");
toast.setCusToastGravity(Gravity.CENTER, 0, 0)
        .setTextSize(16)
        .setStyle(CusToast.Style.GRAY_1)
        .setTextColor(Color.WHITE)
        // .setBackground(R.mipmap.ic_launcher)
        // .setBackgroundColor(0xffff3444)
        .setCusToastDuration(Toast.LENGTH_SHORT)
        .show();

在此列举一下CusToast的几种内置样式。

Style 预览
DEFAULT
DEFAULT
LIGHT_BLUE
LIGHT_BLUE
LIGHT_RED
LIGHT_RED
RED
RED
LIGHT_GREEN
LIGHT_GREEN
GREEN
GREEN
LIGHT_YELLOW
LIGHT_YELLOW
YELLOW
YELLOW
GRAY_1
GRAY_1

其他样式

样式 预览
CusToastWithSub
CusToastWithSub
CusToastWithIcon
CusToastWithIcon

开源库、样例工程、详细文档下载地址:
liying2008/CusToast

该库已上传至jcenter仓库,使用Android Studio可以通过在线依赖引用的方式引入该库。

dependencies {
  compile 'cc.duduhuo.custoast:custoast:0.2'
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,570评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,327评论 25 707
  • 发条精灵 和着蓝调 在窗口颤着芭蕾 老鼠大胆走出洞口 与猫一起 沐浴阳光 如果排除 脆生的玻璃 被晒碎的可能性 那...
    741a45b23ef8阅读 130评论 0 0
  • 清货第一天去普罗旺世上班,骑着电动车,早上路上人很多,人来人往,一路骑行了大约1小时左右,导航提示我距离,大约可以...
    马骏辉阅读 619评论 0 0
  • 春色正好的三月,桃花灼灼,樱花粉嫩,梨花如雪,柳条抽了新枝,湖面映了春光,海风柔了音调……一如往日,可却再无当日坐...
    玉无双阅读 319评论 0 0