前言
相信大部分仁兄在使用系統Toast的時候,都感覺不太盡如人意,因為系統Toast顯示的位置比較固定,并且字體顏色等會跟隨系統版本變化,那么能不能自己寫一個呢,答案是當然的。當然,這是本文的一個重點,還有一個重點是,要對上一篇Android工具類里面的ToastUtils進行勘誤,大概你現在還不太明白,容我慢慢道來,你且看著。
先上圖
首先
先看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>
最后
也歡迎大家關注我的簡書Silence瀟湘夜雨 和 githubSilence瀟湘夜雨
小可不才,如果什么地方寫的不對,還請指正。