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潇湘夜雨
小可不才,如果什么地方写的不对,还请指正。

相关文章
|
11天前
|
Java API 调度
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
Android系统 自定义开机广播,禁止后台服务,运行手动安装应用接收开机广播
37 0
|
11天前
|
存储 Java Linux
Android Mstar增加IR 自定义遥控头码完整调试过程
Android Mstar增加IR 自定义遥控头码完整调试过程
24 1
|
26天前
|
缓存 测试技术 Android开发
深入探究Android中的自定义View绘制优化策略
【4月更文挑战第8天】 在Android开发实践中,自定义View的绘制性能至关重要,尤其是当涉及到复杂图形和动画时。本文将探讨几种提高自定义View绘制效率的策略,包括合理使用硬件加速、减少不必要的绘制区域以及利用缓存机制等。这些方法不仅能改善用户体验,还能提升应用的整体性能表现。通过实例分析和性能测试结果,我们将展示如何有效地实现这些优化措施,并为开发者提供实用的技术指南。
|
1月前
|
前端开发 Android开发 开发者
深入探究Android中的自定义View组件开发
【4月更文挑战第3天】 在现代Android应用程序的开发过程中,创建具有独特功能和高度定制化的用户界面是一个常见需求。为此,理解并掌握自定义View组件的开发成为了开发者必备的技能之一。本文将深入探讨如何在Android中创建自定义View,从基础的绘制原理到事件处理机制,再到性能优化技巧,旨在为读者提供一个全面的技术视角,并通过实例代码演示如何实现一个功能丰富、响应迅速的自定义View组件。
|
1月前
|
XML Java Android开发
Android实现自定义进度条(源码+解析)
Android实现自定义进度条(源码+解析)
56 1
|
11天前
|
Android开发 芯片
Android源代码定制:移除无用lunch|新建lunch|自定义customize.mk
Android源代码定制:移除无用lunch|新建lunch|自定义customize.mk
25 3
|
11天前
|
移动开发 Java Unix
Android系统 自动加载自定义JAR文件
Android系统 自动加载自定义JAR文件
33 1
|
11天前
|
Shell Android开发 开发者
Android系统 自定义动态修改init.custom.rc
Android系统 自定义动态修改init.custom.rc
26 0
|
11天前
|
存储 安全 Android开发
Android系统 自定义系统和应用权限
Android系统 自定义系统和应用权限
23 0
|
22天前
|
XML 数据可视化 Android开发
深入探究Android中的自定义View组件开发
【4月更文挑战第12天】在安卓应用开发中,创建具有独特交互和视觉表现的自定义View组件是增强用户体验的重要手段。本文将详细阐述如何从头开始构建一个Android自定义View,包括理解View的工作原理、处理绘制流程、事件分发机制以及属性的自定义与管理。通过具体案例分析,我们将一步步实现一个可定制的动态进度条,不仅具备基础功能,还能根据业务需求进行扩展,体现高度的产品个性化。