Android 自定义Toast,并且勘误Android工具类里面的ToastUtils-阿里云开发者社区

开发者社区> silence木易> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android SDK工具(谷歌提供的16个工具)简介
    Android SDK包含了许多可以帮助你开发Android平台应用的工具。这些工具分为两类:一是SDK工具;而是平台工具。SDK工具独立于平台,任何开发Android应用的平台都需要配置。
953 0
Android 用属性动画自定义view的渐变背景
自定义view渐变背景,同时监听手势自动生成小圆球。   宿主Activity如下:   package com.edaixi.tempbak; import java.util.ArrayList; import android.
648 0
Android Log工具类
import java.text.SimpleDateFormat; import java.util.Date; import android.util.Log; public class LogUtil { private static final boolean DEBU...
602 0
【Android】Android自定义带board的圆角控件
介绍 圆角控件常用于头像,按钮,图标等,用途十分广泛,而且常常配合board使用。 在IOS中,UIVIew的CALayer层已经提供了圆角和board的方法,所以圆角控件的制作非常简单,只需要类似以下简单代码即可实现: view.layer.cornerRadius = 20; view.layer.borderColor = [UIColor yellow
2279 0
android自定义xmls文件属性
<p style="color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px"> 在使用到自定义View的xml布局文件中需要加入xmlns:前缀=<a target="_blank" href="http://schemas.android.com/apk/res/%E4%BD%A0%E7%9A%8
759 0
Android 自定义ToolBar并沉浸式
  ToolBar是Android 5.0推出的一个新的导航控件用于取代之前的ActionBar,由于其高度的可定制性、灵活性、具有Material Design风格等优点,越来越多的App也用上了ToolBar。
836 0
+关注
silence木易
Android开发一枚
22
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载