自定义Toast

一般自己写代码测试的时候都会直接Toast.makeText(context, text, duration);
但是可能在一个比较大的项目一般不会这样做。


UiHelper.java

package com.example.ui;

import com.example.jpush.MyApp;
import com.example.jpush.R;

import android.view.Gravity;
import android.widget.TextView;
import android.widget.Toast;

public class UiHelper {


    public static void showToast(String msg) {
        showToast(msg, 0);
    }

    public static void showToast(String msg, int drawableResId) {
        TextView textView = new TextView(MyApp.getContext());// 直接获得app的context,MyApp为自己编写继承Application的类
        textView.setBackgroundResource(R.drawable.toast);
        textView.setPadding(24, 24, 24, 24);// 挤开一下空间
        textView.setGravity(Gravity.CENTER);
        textView.setText(msg);
        if (drawableResId != 0) {
            textView.setCompoundDrawablePadding(20);//
            textView.setCompoundDrawablesWithIntrinsicBounds(drawableResId, 0,0, 0);//往TextView添加图片
        }


        Toast toast = new Toast(MyApp.getContext());
        toast.setDuration(Toast.LENGTH_LONG);
        // toast.setText(msg);//传入String类型会崩溃
        toast.setView(textView);
        toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);// 设置toast的位置
        toast.show();
    }

}

toast.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"><!-- 形状 -->
    <corners android:radius="8dip"/><!-- 角 -->
    <solid android:color="#e0333333"/><!-- 背景,固体 -->
</shape>
<!-- 就是一个圆角效果 -->

MainActivity.java

...

//用下面方式直接调用
UiHelper.showToast("自定义Toast");
//Or 
UiHelper.showToast("自定义Toast",R.draw.ok);//带图案

...

效果:
这里写图片描述


update 2016/12/ 7

package cn.flyrise.android.shared.utility;

import android.graphics.Color;
import android.os.Handler;
import android.view.Gravity;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

import cn.flyrise.fggp.FEApplication;
import cn.flyrise.fggp.FEUtil;
import cn.flyrise.fggp.R;


/**
 * author yj
 */
public class FEToast {
    private static List<MessageToast> toastList = new ArrayList<MessageToast>();
    // 在duration时间内能同时放入多少条toast
    private static int maxToast = 5;

    public static void showMessage(CharSequence msg) {
        if (toastList.size() == 0) {
            init();
        }

        boolean canEnqueue = false;
        for (int i = 0; i < maxToast; i++) {
            final MessageToast messageToast = toastList.get(i);
            if (!messageToast.isEnqueue()) {
                canEnqueue = true;
                messageToast.setEnqueue(true);
                messageToast.setToastMessage(msg);
                if (i == 0) {
                    handleCancel(messageToast, i);
                }
                messageToast.getToast().show();
                break;
            }
        }
        if (!canEnqueue) {
            hideAllMessage();
            showMessage(msg);
        }


    }

    private static void handleCancel(final MessageToast messageToast, final int i) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                messageToast.getToast().cancel();
                messageToast.setEnqueue(false);
                int nextToast = i + 1 >= maxToast ? 0 : i + 1;
                if (toastList.get(nextToast).isEnqueue()) {
                    handleCancel(toastList.get(nextToast), nextToast);
                }
            }
        }, messageToast.getDuration());
    }


    public static void hideAllMessage() {
        for (int i = 0; i < maxToast; i++) {
            final MessageToast messageToast = toastList.get(i);
            if (messageToast.isEnqueue()) {
                messageToast.getToast().cancel();
            }
        }

    }

    public static void init() {
        for (int i = 0; i < maxToast; i++) {
            toastList.add(new MessageToast());
        }
    }


    static class MessageToast {
        private boolean isEnqueue;
        private Toast toast;
        // 不能大于3500!
        private int duration = 1000;

        public Toast getToast() {
            return toast;
        }

        public boolean isEnqueue() {
            return isEnqueue;
        }

        public void setEnqueue(boolean enqueue) {
            isEnqueue = enqueue;
        }

        public MessageToast() {
            TextView textView = new TextView(FEApplication.getContext());
            textView.setBackgroundResource(R.drawable.toast);
            textView.setPadding(24, 24, 24, 24);// 挤开一下空间
            textView.setGravity(Gravity.CENTER);
            textView.setTextColor(Color.WHITE);
            textView.setTextSize(17);
            toast = new Toast(FEApplication.getContext());
            toast.setDuration(Toast.LENGTH_LONG);
            toast.setView(textView);
            toast.setGravity(Gravity.BOTTOM, 0, FEUtil.dipToPx(90));// 设置toast的位置
        }

        public void setToastMessage(CharSequence message) {
            ((TextView) toast.getView()).setText(message);
        }

        public int getDuration() {
            return duration;
        }


    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值