前言:

一直在考虑写一下Android实际项目中的一些总结,翻看CSDN博客,上一篇已经是一年多曾经。

本系列定位Android基础工具类重构。旨在记录实际项目中经经常使用到的一些工具类,比方Toast、Dialog、动画类,ImageLoader类等等。正在梳理,但发现梳理完再写预计黄花菜都凉了。所以改变策略,边写边梳理。

首先要写的就是这个Toast。

一、说明

作为Android系统提供的基类,Toast是最简单的提示消息类。特点悬浮。跨界面(Activity)特定时间内自己主动销毁。

二、简单使用

Toast.makeText(getApplicationContext(), "你想提示的信息",Toast.LENGTH_SHORT).show();

// 特别说一下:查看源代码会发现makeText方法会返回一个Toast实例,例如以下:

// 由于每次都会new一个新的Toast,这也就是为什么假设同一时候间多次调用makeText会弹出多个提示框。直到全部的提示完毕才消失

源代码:

  public static Toast makeText(Context context, CharSequence text, @Duration int duration) {
Toast result = new Toast(context); LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text); result.mNextView = v;
result.mDuration = duration; return result;
}

三、复杂使用

我们看到上图源代码。用到了layout组件。那也就是说我们也能够定义自己的View,Toast提供了在屏幕上的显示位置。

这样我们就能够自己定义自己的样式的而且在须要的位置显示的Toast。见四

四、实际项目中使用

4.1、相关知识点

1)在实际项目中Toast样式是一致的,也就是说整个APP生命周期内仅仅须要一个Toast实例就可以

2)Toast中使用的Context直接使用Appliction中的Context就可以。

由于APP中Context的数量=1个Application + n*Activity的数量 + m*Service的数量

4.2、会遇到的问题

避免上面所说的多次反复弹出Toast,所以我们将会推断Toast实例是否存在,假设存在直接使用。假设不存在才new

4.3、效果

本例中使用的是在界面顶部弹出自己定义的Toast。假设成功弹出绿色提示条,失败弹出黄色提示条

4.4、话不多说,上代码

package com.ray.utils;

import android.content.Context;
import android.content.res.Resources;
import android.os.Handler;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; import com.ray.R;
import com.ray.app.utils.ApplicationUtil; /**
* User: Ray
* Date: 16/3/3
* ReadMe: Toast-工具类
*/
public class ToastUtil { private static Context context = BaseApplication.getInstance();// App生命周期中唯一Context。BaseApplication继承Application
private static LayoutInflater inflater = LayoutInflater.from(context);// 布局载入
private static View myToastView = inflater.inflate(R.layout.layout_top_toast, null);
private static TextView msgView = (TextView) myToastView.findViewById(R.id.tv_msg_text); private static final int TYPE_CODE_SUCCESS = 0x01;
private static final int TYPE_CODE_ERROR = 0x02;
private static final int COLOR_SUCCESS = context.getResources().getColor(R.color.msg_status_success);
private static final int COLOR_ERROR = context.getResources().getColor(R.color.msg_status_warn);
private static final int DEFAULT_TIME_DELAY = 50;// 单位:毫秒 private static Toast toast;// 系统提示类
private static Handler handler; public static void showSuccessMsg(int msgResId) {
try {
showSuccessMsg(context.getString(msgResId));
} catch (Resources.NotFoundException e) {
e.printStackTrace();
}
} public static void showErrorMsg(int msgResId) {
try {
showErrorMsg(context.getString(msgResId));
} catch (Resources.NotFoundException e) {
e.printStackTrace();
}
} public static void showSuccessMsg(String msg) {
showMsg(TYPE_CODE_SUCCESS, msg);
} public static void showErrorMsg(String msg) {
showMsg(TYPE_CODE_ERROR, msg);
} private static void showMsg(final int typeCode, final String msg) {
if (context == null//
|| !ApplicationUtil.isRunningForeground(context)// 假设APP回到后台,则不显示
|| msg == null) {
return;
} if (toast == null) {// 防止反复提示:不为Null,即全局使用同一个Toast实例
toast = new Toast(context);
} if (handler == null) {
handler = new Handler();
} handler.postDelayed(new Runnable() {
@Override
public void run() {
int msgViewBagColor = 0;
switch (typeCode) {
case TYPE_CODE_SUCCESS:
msgViewBagColor = COLOR_SUCCESS;
break;
case TYPE_CODE_ERROR:
msgViewBagColor = COLOR_ERROR;
break;
default:
msgViewBagColor = COLOR_SUCCESS;
break;
}
msgView.setBackgroundColor(msgViewBagColor);
msgView.setText(msg);
toast.setView(myToastView);
toast.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, 0);// 顶部居中
toast.setDuration(Toast.LENGTH_SHORT);
toast.show(); }
}, DEFAULT_TIME_DELAY);
} // 暂不正确外提供:主要针对须要在某个时候,取消提示
private static void cancelToast() {
if (toast != null) {
toast.cancel();
toast = null;
}
}
}

<?xml version="1.0" encoding="utf-8"?

>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="false"
android:focusable="false"> <TextView
android:id="@+id/tv_msg_text"
android:layout_width="match_parent"
android:layout_height="@dimen/nav_height"
android:background="@color/msg_status_success"
android:ellipsize="end"
android:gravity="center"
android:maxLines="2"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:textColor="@color/white"
android:textSize="16dp" />
</RelativeLayout>

五、Android5.0官方新替代组件

眼下市面上未见有太多使用,兴许补充。

。。

Android基础工具类重构系列一Toast的更多相关文章

  1. Android 常见工具类封装

    1,MD5工具类: public class MD5Util { public final static String MD5(String s) { char hexDigits[] = { '0' ...

  2. (转载)android 一些工具类汇总

    android 一些工具类汇总 作者:曾田生z 字体:[增加 减小] 类型:转载 时间:2016-08-14我要评论 本文给大家汇总介绍了一些常用的Android工具类,非常的简单实用,有需要的小伙伴 ...

  3. 53. Android常用工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.Prefer ...

  4. 【转】Android常用工具类

    主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.Prefe ...

  5. Android自定义工具类获取按钮并绑定事件(利用暴力反射和注解)

    Android中为按钮绑定事件的有几种常见方式,你可以在布局文件中为按钮设置id,然后在MainActivity中通过findViewById方法获取按钮对象实例,再通过setOnClickListe ...

  6. Android 常用工具类之SPUtil,可以修改默认sp文件的路径

    参考: 1. 利用Java反射机制改变SharedPreferences存储路径    Singleton1900 2. Android快速开发系列 10个常用工具类 Hongyang import ...

  7. Android常见工具类封装

    MD5加密 import android.annotation.SuppressLint; import java.security.MessageDigest; public class MD5 { ...

  8. android开发工具类总结(一)

    一.日志工具类 Log.java public class L { private L() { /* 不可被实例化 */ throw new UnsupportedOperationException ...

  9. android常用工具类

    import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkIn ...

随机推荐

  1. Extending and Embedding PHP

    Extending and Embedding PHP http://wizardmin.com/2010/08/extending-and-embedding-php-6/

  2. Sublime Text 2搭建Go开发环境(Windows)

    转自:http://blog.csdn.net/love_se/article/details/7754274 下载packcontrol包地址:http://www.imjeff.cn/blog/6 ...

  3. 移动对meta的定义(转)

    以下是meta每个属性详解 尤其要注意的是content里多个属性的设置一定要用分号+空格来隔开,如果不规范将不会起作用. 一.<meta http-equiv="Content-Ty ...

  4. JS打开新窗口防止被浏览器阻止的方法[转]

    本文实例讲述了JS打开新窗口防止被浏览器阻止的方法.分享给大家供大家参考.具体分析如下: 用传统的window.open()方式打开新窗口,会被浏览器阻止,那么,我们如何才能让JS打开新窗口不被浏览器 ...

  5. NSURLRequestCachePolicy 缓存策略

    1> NSURLRequestUseProtocolCachePolicy = 0, 默认的缓存策略, 如果缓存不存在,直接从服务端获取.如果缓存存在,会根据response中的Cache-Co ...

  6. Hadoop分布式文件系统使用指南

    原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_user_guide.html 目的 概述 先决条件 Web接口 Shell命令 DFSAdmin命 ...

  7. 【Linux】撷取命令grep

    什么是撷取命令啊?说穿了,就是将一段数据经过分析后,取出我们所想要的.或者是经由分析关键词,取得我们所想要的那一行! 不过,要注意的是,一般来说,撷取信息通常是针对『一行一行』来分析的, 并不是整篇信 ...

  8. Linux内核scatterlist API介绍

    1. 前言 我们在那些需要和用户空间交互大量数据的子系统(例如MMC[1].Video.Audio等)中,经常看到scatterlist的影子.对我们这些“非英语母语”的人来说,初见这个词汇,脑袋瞬间 ...

  9. ios app 实现热更新(无需发新版本号实现app加入新功能)

    眼下可以实现热更新的方法,总结起来有下面三种 1. 使用FaceBook 的开源框架 reactive native,使用js写原生的ios应用 ios app能够在执行时从server拉取最新的js ...

  10. [转]Golang 中使用 JSON 的小技巧

    taowen是json-iterator的作者. 序列化和反序列化需要处理JSON和struct的关系,其中会用到一些技巧. 原文 Golang 中使用 JSON 的小技巧是他的经验之谈,介绍了一些s ...