前言
相信大部分仁兄在使用系統Toast的時候,都感覺不太盡如人意,因為系統Toast顯示的位置比較固定,并且字型顔色等會跟随系統版本變化,那麼能不能自己寫一個呢,答案是當然的。當然,這是本文的一個重點,還有一個重點是,要對上一篇
Android工具類裡面的ToastUtils進行勘誤,大概你現在還不太明白,容我慢慢道來,你且看着。
先上圖
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYjYkVjZkZzMkVTZwcjMjVTN0gDM5AzNlVDM2gTN4UmZfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
![系統Toast.png](http://upload-images.jianshu.io/upload_images/1716569-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潇湘夜雨和 github
小可不才,如果什麼地方寫的不對,還請指正。