美文网首页Android工具类Android开发程序员
Android 自定义Toast,并且勘误Android工具类里

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

作者: Silence潇湘夜雨 | 来源:发表于2017-03-30 15:45 被阅读498次

    前言

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


    先上图

    ![系统Toast.png](https://img.haomeiwen.com/i1716569/cf64bfc0bee87b5a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 自定义的不带图片的Toast(代码里编辑布局).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 自定义Toast,并且勘误Android工具类里

      本文链接:https://www.haomeiwen.com/subject/hhtpottx.html