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

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

    。。

  • 相关阅读:
    Jenkins+SVN+Maven自动化部署环境搭建
    基于Maven+SSM整合shiro+Redis实现后台管理项目
    Linux学习之CentOS(一)----在VMware虚拟机中安装CentOS 7
    如何用Jmeter做压力测试
    项目沟通管理中的几种技巧
    软件生命周期管理(ALM)
    大数据入门-记录
    为啥项目做到最后都成为了“屎山”,代码改不动
    看企业如何玩转低代码,引发效率革命
    行云创新亮相云栖大会,解读云原生时代开发者工具变革探索与实践
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7352789.html
Copyright © 2020-2023  润新知