前言:

一直在考虑写一下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. 如何判断Android手机当前是否联网?

    如果拟开发一个网络应用的程序,首先考虑是否接入网络,在Android手机中判断是否联网可以通过 ConnectivityManager 类的isAvailable()方法判断, 首先获取网络通讯类的实 ...

  2. UNIX域套接字编程和socketpair 函数

    一.UNIX Domain Socket IPC socket API原本是为网络通讯设计的,但后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket.虽然网络soc ...

  3. ActiveReports 报表控件官方中文新手教程 (1)-安装、激活以及产品资源

     本系列文章主要是面向初次接触 ActiveReports 产品的用户,能够帮助您在三天之内轻松的掌握ActiveReports控件的基本用法,包含安装.激活.创建报表.绑定数据源以及公布等内容. ...

  4. POJ 1465 Multiple (BFS,同余定理)

    id=1465">http://poj.org/problem?id=1465 Multiple Time Limit: 1000MS   Memory Limit: 32768K T ...

  5. Python ljust() 方法

    描述 ljust() 方法返回一个原字符串左对齐,并使用指定字符填充至指定长度的新字符串,默认的填充字符为空格.如果指定的长度小于原字符串的长度则返回原字符串. 语法 ljust() 方法语法: S. ...

  6. HLJU 1046: 钓鱼(数据增强版) (贪心+优化)

    1046: 钓鱼(数据增强版) Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 11  Solved: 3 [id=1046">Subm ...

  7. [面试题] Find next higher number with same digits

    Find next higher number with same digits. Example 1 : if num = 25468, o/p = 25486 Example 2 : if num ...

  8. hdu4901The Romantic Hero

    #include<iostream> #include<map> #include<string> #include<cstring> #include ...

  9. 创建Hive/hbase相关联的表异常

    hive> CREATE TABLE hperson(id string, name string,email string) STORED BY 'org.apache.hadoop.hive ...

  10. 面向对象中private理解

    我们大家都知道思想訪问修饰符.public,protected,private,那么我们知道了继承中private私有属性能够继承吗?我么接下来做个小实验 class A {     private ...