• 简单好用的Toast封装类——EasyToast


    我们用toast时不能设置显示的时间,而且不支持在线程中展示toast,下面我对原始的toast进行了封装,这样我们可以很方便的进行toast的使用了。

    package com.kale.lib.utils;
    
    import android.content.Context;
    import android.os.Handler;
    import android.os.Looper;
    import android.support.annotation.IntDef;
    import android.support.annotation.NonNull;
    import android.view.View;
    import android.widget.Toast;
    
    /**
     * @author Jack Tony
     * @date 2015/4/29
     */
    public class EasyToast {
    
        @IntDef({Toast.LENGTH_SHORT, Toast.LENGTH_LONG})
        private @interface Length {}
    
        private Toast mToast = null;
    
        private Handler mHandler = null;
    
        private int duration = 0;
    
        private int currDuration = 0;
    
        private final int DEFAULT = 2000;
    
        public EasyToast(Context context) {
            currDuration = DEFAULT;
            mHandler = new Handler(context.getMainLooper());
            mToast = Toast.makeText(context, "", Toast.LENGTH_LONG);
        }
    
        private Runnable mToastThread = new Runnable() {
    
            public void run() {
                mToast.show();
                mHandler.postDelayed(mToastThread, DEFAULT);// 每隔2秒显示一次
                if (duration != 0) {
                    if (currDuration <= duration) {
                        currDuration += DEFAULT;
                    } else {
                        cancel();
                    }
                }
            }
        };
    
        /**
         * 返回内部的toast对象。可以进行多样化的设置
         */
        public Toast getToast() {
            return mToast;
        }
    
        /**
         * 设置toast的文字
         */
        public void setText(String text) {
            mToast.setText(text);
        }
    
        /**
         * 显示toast
         *
         * @param duration toast显示的时间(单位:ms)
         */
        public void show(int duration) {
            this.duration = duration;
            mHandler.post(mToastThread);
        }
    
        /**
         * 设置toast显示的位置
         *
         * @param gravity 位置,可以是Gravity.CENTER等
         * @param xOffset x轴的偏移量
         * @param yOffset y轴的偏移量
         */
        public void setGravity(int gravity, int xOffset, int yOffset) {
            mToast.setGravity(gravity, xOffset, yOffset);
        }
    
        /**
         * 设置toast的view
         */
        public void setView(View view) {
            mToast.setView(view);
        }
    
        /**
         * 让toast消失的方法
         */
        public void cancel() {
            mHandler.removeCallbacks(mToastThread);// 先把显示线程删除
            mToast.cancel();// 把最后一个线程的显示效果cancel掉,就一了百了了
            currDuration = DEFAULT;
        }
    
        //// 封装的静态方法 //////
    
        public static void makeText(@NonNull Context context, int msg) {
            makeText(context, String.valueOf(msg));
        }
    
        public static void makeText(@NonNull Context context, String msg) {
            if (context != null) {
                Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
            }
        }
    
        public static void makeText(@NonNull Context context, int msg, @Length int length) {
            makeText(context, String.valueOf(msg), length);
        }
    
        public static void makeText(@NonNull Context context, String msg, @Length int length) {
            if (length == Toast.LENGTH_SHORT || length == Toast.LENGTH_LONG) {
                if (context != null) {
                    Toast.makeText(context, msg, length).show();
                }
            }
        }
    
        /**
         * 当你在线程中使用toast时,请使用这个方法
         */
        public static void makeTextInThread(@NonNull final Context context, int msg) {
            makeTextInThread(context, String.valueOf(msg));
        }
    
        /**
         * 当你在线程中使用toast时,请使用这个方法
         */
        public static void makeTextInThread(@NonNull Context context, String msg) {
            makeTextInThread(context, msg, Toast.LENGTH_SHORT);
        }
    
        /**
         * 当你在线程中使用toast时,请使用这个方法
         */
        public static void makeTextInThread(@NonNull Context context, int msg, @Length int length) {
            makeTextInThread(context, String.valueOf(msg), length);
        }
    
        public static void makeTextInThread(@NonNull final Context context, final String msg, @Length final int length) {
            new Thread() {
                @Override
                public void run() {
                    Looper.prepare();//先移除
                    Toast.makeText(context, msg, length).show();
                    Looper.loop();// 进入loop中的循环,查看消息队列
                }
            }.start();
        }
    }
  • 相关阅读:
    阿里云高级技术专家周晶:基于融合与协同的边缘云原生体系实践
    Spring Boot Serverless 实战系列“架构篇” 首发 | 光速入门函数计算
    基于 EMR OLAP 的开源实时数仓解决方案之 ClickHouse 事务实现
    【ClickHouse 技术系列】 在 ClickHouse 中处理实时更新
    LeetCode_Two Sum
    LeetCode_ Remove Element
    LeetCode_Same Tree
    LeetCode_Symmetric Tree
    LeetCode_Path Sum
    LeetCode_Merge Sorted Array
  • 原文地址:https://www.cnblogs.com/tianzhijiexian/p/4494165.html
Copyright © 2020-2023  润新知