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官方新替代组件

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

。。

时间: 2024-12-15 22:35:34

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

Android基础入门教程——2.5.1 Toast(吐司)的基本使用

Android基础入门教程--2.5.1 Toast(吐司)的基本使用 标签(空格分隔): Android基础入门教程 本节引言: 好的,终于学习完Adapter类相关的一些控件,当然除了讲解的那几个,还有其他很多的 相关的控件,就不慢慢讲解了~有需要的自行查阅文档,查看相关的用法,本节带来的是: Android用于提示信息的一个控件--Toast(吐司)!Toast是一种很方便的消息提示框,会在 屏幕中显示一个消息提示框,没任何按钮,也不会获得焦点一段时间过后自动消失! 非常常用!本节我们就来

Android常用工具类

主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.PreferencesUtils.JSONUtils.FileUtils.ResourceUtils.StringUtils.ParcelUtils.RandomUtils.ArrayUtils.ImageUtils.ListUtils.MapUtils.ObjectUtils.SerializeUtils.S

Android常用工具类(收藏)

Android常用工具类 主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java. 目前包括(HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.PreferencesUtils.JSONUtils.FileUtils.ResourceUtils.StringUtils.ParcelUtils.RandomUtils.ArrayUtils.ImageUtils.ListUtils.MapUtils.ObjectUtils.S

Android常用工具类 (转)

主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.PreferencesUtils.JSONUtils.FileUtils.ResourceUtils.StringUtils.ParcelUtils.RandomUtils.ArrayUtils.ImageUtils.ListUtils.MapUtils.ObjectUtils.SerializeUtils.S

53. Android常用工具类

主要介绍总结的Android开发中常用的工具类,大部分同样适用于Java.目前包括HttpUtils.DownloadManagerPro.ShellUtils.PackageUtils.PreferencesUtils.JSONUtils.FileUtils.ResourceUtils.StringUtils.ParcelUtils.RandomUtils.ArrayUtils.ImageUtils.ListUtils.MapUtils.ObjectUtils.SerializeUtils.S

Android 系统工具类SystemUtils收集整理(持续更新)

最近做的功能中涉及到了一些关于系统方面的东西,自己摸索以及网上搜集整理出来了一个工具类方便调用 包含的功能有: 获取系统中所有APP应用.获取用户安装的APP应用.根据包名和Activity启动类查询应用信息.跳转到WIFI设置.WIFI网络开关.移动网络开关.GPS开关 当前若关则打开 当前若开则关闭.调节系统音量.设置亮度.获取屏幕的亮度.跳转到系统设置.获取文件夹下所有文件.获取视频的缩略图 .打开视频文件... 工具类会持续更新,与大家共同学习进步. SystemUtils.java p

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

Android中为按钮绑定事件的有几种常见方式,你可以在布局文件中为按钮设置id,然后在MainActivity中通过findViewById方法获取按钮对象实例,再通过setOnClickListener为按钮绑定事件,如下所示: //1.获取控件 btn = (Button)findViewById(R.id.button1); //2.绑定事件 btn.setOnClickListener(new OnClickListener() { @Override public void onCl

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

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

android开发工具类总结(一)

一.日志工具类 Log.java 1 public class L 2 { 3 private L() 4 { 5 /* 不可被实例化 */ 6 throw new UnsupportedOperationException("Cannot be instantiated!"); 7 } 8 // 是否需要打印bug,可以在application的onCreate函数里面初始化 9 public static boolean isDebug = true; 10 private sta