天天看點

Android 自定義Toast,并且勘誤Android工具類裡面的ToastUtils前言最後

前言

相信大部分仁兄在使用系統Toast的時候,都感覺不太盡如人意,因為系統Toast顯示的位置比較固定,并且字型顔色等會跟随系統版本變化,那麼能不能自己寫一個呢,答案是當然的。當然,這是本文的一個重點,還有一個重點是,要對上一篇

Android工具類

裡面的ToastUtils進行勘誤,大概你現在還不太明白,容我慢慢道來,你且看着。

先上圖

Android 自定義Toast,并且勘誤Android工具類裡面的ToastUtils前言最後

![系統Toast.png](http://upload-images.jianshu.io/upload_images/1716569-cf64bfc0bee87b5a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

Android 自定義Toast,并且勘誤Android工具類裡面的ToastUtils前言最後

自定義的不帶圖檔的Toast(代碼裡編輯布局).png

Android 自定義Toast,并且勘誤Android工具類裡面的ToastUtils前言最後

自定義的帶圖檔的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潇湘夜雨

和 github

小可不才,如果什麼地方寫的不對,還請指正。

繼續閱讀