Android基础工具类重构系列一Toast

前言:

一直在考虑写一下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官方新替代组件

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

。。

相关文章