Android 自定义Toast,并且勘误Android工具类里面的ToastUtils

简介: 前言相信大部分仁兄在使用系统Toast的时候,都感觉不太尽如人意,因为系统Toast显示的位置比较固定,并且字体颜色等会跟随系统版本变化,那么能不能自己写一个呢,答案是当然的。

前言

相信大部分仁兄在使用系统Toast的时候,都感觉不太尽如人意,因为系统Toast显示的位置比较固定,并且字体颜色等会跟随系统版本变化,那么能不能自己写一个呢,答案是当然的。当然,这是本文的一个重点,还有一个重点是,要对上一篇Android工具类里面的ToastUtils进行勘误,大概你现在还不太明白,容我慢慢道来,你且看着。


先上图

img_fe858605e70908455c270e5d36df5db6.png
![系统Toast.png](http://upload-images.jianshu.io/upload_images/1716569-cf64bfc0bee87b5a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
img_392f53f60e263ccec43929731ff4503f.png
自定义的不带图片的Toast(代码里编辑布局).png
img_e7921dd699497e0154a64dd190331906.png
自定义的带图片的Toast.png

首先

先看toast源码

   public void setText(CharSequence s) {    
    if (mNextView == null) {    
        throw new RuntimeException("This Toast was not created with Toast.makeText()");    
    }    
    TextView tv = (TextView) mNextView.findViewById(com.android.internal.R.id.message);    
    if (tv == null) {    
        throw new RuntimeException("This Toast was not created with Toast.makeText()");    
    }    
    tv.setText(s);    
}  

如果不指定view,则mNextView的值为null。就会抛出异常。另外使用第一种方式时,就算你为Toast设置好了View也不能这样调用:toast.setText(s);
会抛出This Toast was not created with Toast.makeText()异常。解决的办法是定义一个TextView,然后为TextView赋值,再加到XXLayout中,
使用setView(XXLayout)把XXLayout设置成Toast的View。

本人遇到的错误我也一并贴出来
Caused by: java.lang.RuntimeException: This Toast was not created with Toast.makeText()
at android.widget.Toast.setText(Toast.java:275)
at cn.and.ToastActivity.onCreate(ToastActivity.java:20)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)

再看看Android 工具类里面的ToastUtils写法

   public static void showToast(Context context, String message) {
if (toast == null) {
    toast = Toast.makeText(context, message, Toast.LENGTH_SHORT);
} else {
    toast.setText(message);
}
toast.show();
}

虽然平时用着不会报错,但是有的时候还是会报错,为了防患于未然,今天就重新放出自己查阅资料后修改的Toast工具类

其次,请各位看官看Toast工具类

由于代码比较简单,我也就不再一一赘述了,相信各位看官都可以看懂

  public class ToastUtils {
public static final int LENGTH_SHORT = 0;
public static final int LENGTH_LONG = 1;
private static View toastView;
private WindowManager mWindowManager;
private static int mDuration;
private final int WHAT = 100;
private static View oldView;
private static Toast toast;
private static CharSequence oldText;
private static CharSequence currentText;
private static ToastUtils instance = null;
private static TextView textView;
// 是否显示
private static boolean isShow = true;
private static ImageView mImgIcon;
private static TextView mTxtMsg;
private static LinearLayout mLytShow;
   /**
 * 显示消息(这个是把文本颜色和背景色没有提出来的写法)
 * 
 * @param context
 *            上下文
 * @param message
 *            消息内容
 */
public static void showToast(Context context, String message) {
    if (isShow) {
        toast = new Toast(context);
        // 消息内容
        mTxtMsg = new TextView(context);
        LinearLayout.LayoutParams lParams1 = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        mTxtMsg.setTextColor(Color.parseColor("#000000"));
        mTxtMsg.setTextSize(DensityUtils.dp2px(context, 12));
        mTxtMsg.setPadding(10, 5, 10, 5);

        mTxtMsg.setLayoutParams(lParams1);

        mLytShow = new LinearLayout(context);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        mLytShow.setOrientation(LinearLayout.HORIZONTAL);
        mLytShow.setLayoutParams(params);

        int roundRadius = 100; // 8dp 圆角半径
        int fillColor = Color.parseColor("#F89009");// 内部填充颜色
        GradientDrawable gd = new GradientDrawable();// 创建drawable
        gd.setCornerRadius(roundRadius);
        gd.setColor(fillColor);

        mLytShow.setBackgroundDrawable(gd);
        mLytShow.addView(mTxtMsg);

        if (message != null) {
            mTxtMsg.setText(message);
        }
        toast.setView(mLytShow);
        toast.setGravity(Gravity.BOTTOM, 0,
                DensityUtils.dp2px(context, 100));
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.show();
    }
}
/**
 * 显示消息(这个是把文本颜色和toast背景颜色提出来的写法)
 * 
 * @param context
 *            上下文
 * @param message
 *            消息内容
 */
public static void showToast(Context context, String message,
        String textColor, String bgColor) {
    if (isShow) {
        toast = new Toast(context);
        // 消息内容
        mTxtMsg = new TextView(context);
        LinearLayout.LayoutParams lParams1 = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        mTxtMsg.setTextColor(Color.parseColor(textColor));
        mTxtMsg.setTextSize(DensityUtils.dp2px(context, 12));
        mTxtMsg.setPadding(10, 5, 10, 5);

        mTxtMsg.setLayoutParams(lParams1);

        mLytShow = new LinearLayout(context);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        mLytShow.setOrientation(LinearLayout.HORIZONTAL);
        mLytShow.setLayoutParams(params);

        int roundRadius = 100; // 8dp 圆角半径
        int fillColor = Color.parseColor(bgColor);// 内部填充颜色
        GradientDrawable gd = new GradientDrawable();// 创建drawable
        gd.setCornerRadius(roundRadius);
        gd.setColor(fillColor);

        mLytShow.setBackgroundDrawable(gd);
        mLytShow.addView(mTxtMsg);

        if (message != null) {
            mTxtMsg.setText(message);
        }
        toast.setView(mLytShow);
        toast.setGravity(Gravity.BOTTOM, 0,
                DensityUtils.dp2px(context, 100));
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.show();
    }
}

/**
 * 显示Toast
 * 
 * @param context
 *            上下文
 * @param message
 *            信息内容
 */
public static void showIconToast(Context context, String message, int resId) {
    if (isShow) {
        toast = new Toast(context);
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.mtoast_layout, null);
        TextView tv = (TextView) view.findViewById(R.id.toast_tv);
        ImageView mImgShow = (ImageView) view.findViewById(R.id.img_toast);
        if (message != null) {
            tv.setText(message);
        }
        mImgShow.setImageResource(resId);
        toast.setView(view);
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.show();
    }
}

/**
 * 显示消息内容(带图标)
 * 
 * @param context
 *            上下文
 * @param message
 *            消息内容
 * @param resId
 *            图片资源id
 * @param textColor
 *            文本颜色
 * @param textSize
 *            文本大小
 * @param bgColor
 *            背景颜色
 */
public static void showIconToastMessage(Context context, String message,
        int resId, String textColor, float textSize, String bgColor) {
    if (isShow) {
        toast = new Toast(context);
        // 图片
        mImgIcon = new ImageView(context);
        LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(
                DensityUtils.dp2px(context, 48), DensityUtils.dp2px(
                        context, 48));
        mImgIcon.setImageResource(resId);
        lParams.gravity = Gravity.CENTER_HORIZONTAL
                | Gravity.CENTER_VERTICAL;
        lParams.setMargins(5, 5, 5, 5);
        mImgIcon.setLayoutParams(lParams);

        // 消息内容
        mTxtMsg = new TextView(context);
        LinearLayout.LayoutParams lParams1 = new LinearLayout.LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        mTxtMsg.setTextColor(Color.parseColor(textColor));
        mTxtMsg.setTextSize(DensityUtils.dp2px(context, textSize));
        mTxtMsg.setLayoutParams(lParams1);

        mLytShow = new LinearLayout(context);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        mLytShow.setOrientation(LinearLayout.HORIZONTAL);
        mLytShow.setLayoutParams(params);

        int roundRadius = 100; // 8dp 圆角半径
        // int strokeColor = Color.parseColor("#2E3135");// 边框颜色
        int fillColor = Color.parseColor(bgColor);// 内部填充颜色
        GradientDrawable gd = new GradientDrawable();// 创建drawable
        gd.setColor(fillColor);
        gd.setCornerRadius(roundRadius);
        // gd.setStroke(0, strokeColor);

        mLytShow.setBackgroundDrawable(gd);
        mLytShow.addView(mImgIcon);
        mLytShow.addView(mTxtMsg);

        if (message != null) {
            mTxtMsg.setText(message);
        }
        toast.setView(mLytShow);
        toast.setGravity(Gravity.CENTER, 0, 0);
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.show();
    }
}
}

再次,资源文件,我也一并贴出来吧

比较简单,就一个ImageView和一个textview

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="@drawable/toast_background"
android:orientation="vertical" >

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center"
    android:orientation="horizontal"
    android:padding="5dp" >

    <ImageView
        android:id="@+id/img_toast"
        android:layout_width="32dp"
        android:layout_height="32dp"
        android:layout_gravity="center"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/toast_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="moren"
        android:textColor="#fff"
        android:textStyle="bold" />
</LinearLayout>

</LinearLayout>

最后

感谢 qiushyfm
Jlanglang

也欢迎大家关注我的简书Silence潇湘夜雨 和 githubSilence潇湘夜雨
小可不才,如果什么地方写的不对,还请指正。

相关文章
|
22天前
|
缓存 前端开发 Android开发
安卓开发中的自定义视图:从零到英雄
【10月更文挑战第42天】 在安卓的世界里,自定义视图是一块画布,让开发者能够绘制出独一无二的界面体验。本文将带你走进自定义视图的大门,通过深入浅出的方式,让你从零基础到能够独立设计并实现复杂的自定义组件。我们将探索自定义视图的核心概念、实现步骤,以及如何优化你的视图以提高性能和兼容性。准备好了吗?让我们开始这段创造性的旅程吧!
22 1
|
2月前
|
Android开发 开发者
安卓应用开发中的自定义视图
【9月更文挑战第37天】在安卓开发的海洋中,自定义视图犹如一座座小岛,等待着勇敢的探索者去发现其独特之处。本文将带领你踏上这段旅程,从浅滩走向深海,逐步揭开自定义视图的神秘面纱。
42 3
|
2月前
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
93 0
|
1月前
|
搜索推荐 前端开发 Android开发
安卓应用开发中的自定义视图实现
【10月更文挑战第30天】在安卓开发的海洋中,自定义视图是那抹不可或缺的亮色,它为应用界面的个性化和交互体验的提升提供了无限可能。本文将深入探讨如何在安卓平台创建自定义视图,并展示如何通过代码实现这一过程。我们将从基础出发,逐步引导你理解自定义视图的核心概念,然后通过一个实际的代码示例,详细讲解如何将理论应用于实践,最终实现一个美观且具有良好用户体验的自定义控件。无论你是想提高自己的开发技能,还是仅仅出于对安卓开发的兴趣,这篇文章都将为你提供价值。
|
1月前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
33 5
|
2月前
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
3月前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
67 10
|
3月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
54 3
|
3月前
|
前端开发 Android开发 开发者
安卓应用开发中的自定义视图基础
【9月更文挑战第13天】在安卓开发的广阔天地中,自定义视图是一块神奇的画布,它允许开发者将想象力转化为用户界面的创新元素。本文将带你一探究竟,了解如何从零开始构建自定义视图,包括绘图基础、触摸事件处理,以及性能优化的实用技巧。无论你是想提升应用的视觉吸引力,还是追求更流畅的交互体验,这里都有你需要的金钥匙。
|
3月前
|
缓存 搜索推荐 Android开发
安卓应用开发中的自定义View组件实践
【9月更文挑战第10天】在安卓开发领域,自定义View是提升用户体验和实现界面个性化的重要手段。本文将通过一个实际案例,展示如何在安卓项目中创建和使用自定义View组件,包括设计思路、实现步骤以及可能遇到的问题和解决方案。文章不仅提供了代码示例,还深入探讨了自定义View的性能优化技巧,旨在帮助开发者更好地掌握这一技能。