標題有點拗口,實際上是能夠分別寫成兩篇博文的。也就是說看完這篇能瞭解兩個方面:java
自定義佈局樣式的Toastandroid
自定義PopupWindow實現多功能Toastide
先感性認識:佈局
觸發事件來自於MenuItem的onClick,具體請看上一篇Android 自定義Menu動畫
一 、自定義佈局樣式的Toast
spa
佈局文件dialog_toast.xmlxml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/dialog_title" android:textSize="@dimen/dialog_toast_title_text_size" android:layout_width="@dimen/dialog_toast_width" android:layout_height="wrap_content" android:gravity="center_horizontal" android:text="@string/toast_dialog_title"/> <TextView android:id="@+id/dialog_content" android:layout_width="@dimen/dialog_toast_width" android:layout_height="wrap_content" android:drawableLeft="@drawable/frog" android:drawableRight="@drawable/fungus" android:layout_below="@id/dialog_title" android:text="@string/toast_dialog_content"/> </RelativeLayout>
使用這個自定義佈局,解決屢次Toast重複彈出。blog
/** * 顯示自定義Toast<p> * private Toast mToast;<br/> * View toastView = mLayoutInflater.inflate(R.layout.dialog_toast, null); * @param toastView */ private void showToast(View toastView) { toastView.setBackgroundColor(Color.TRANSPARENT); if (mToast == null) { mToast = new Toast(mContext); mToast.setView(toastView); mToast.setGravity(Gravity.BOTTOM|Gravity.CENTER, 0, 100); mToast.setDuration(Toast.LENGTH_SHORT); } mToast.show(); }
二 、自定義PopupWindow實現多功能Toast
事件
如下是MenuItem點擊事件的完整代碼,詳細註釋了。utf-8
@Override public void onClick(View v) { /** MenuItem dismiss */ mPopWindow.dismiss(); /** * 自定義PopupWindow模擬多功能Toast */ View popToastView = mLayoutInflater.inflate( R.layout.dialog_toast, null); mPopToast = new PopupWindow(popToastView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true); mPopToast.setBackgroundDrawable(new ColorDrawable( Color.TRANSPARENT)); mPopWindow.setOutsideTouchable(true);// 設置觸摸外面時消失 mPopToast .setAnimationStyle(android.R.style.Animation_Dialog);// 設置動畫效果 mPopToast.showAtLocation(v, Gravity.BOTTOM | Gravity.CENTER, 0, 300); /** * 用PopupWindow模擬Toast,裏面的TextView的點擊事件。 * 由於Toast不獲取焦點,因此View的事件沒法處理。 * 而PopupWindow解決了這個焦點問題。 */ TextView dialogContent = (TextView) popToastView .findViewById(R.id.dialog_content); dialogContent.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mPopToast != null && mPopToast.isShowing()) { mPopToast.dismiss(); /** 再次顯示自定義Toast, 此次是從PopupWindow裏面的TextView觸發的 */ View toastViewAgain = mLayoutInflater.inflate( R.layout.dialog_toast, null); showToast(toastViewAgain); } } }); /** 顯示自定義Toast */ View toastView = mLayoutInflater.inflate( R.layout.dialog_toast, null); showToast(toastView); }
使用PopupWindow實現的Toast能夠不受Toast.LENGTH_SHORT或Toast.LENGTH_LONG的時間限制,而且能夠獲得焦點和用戶交互,好比onClick等等。
Toast自己是一個很是便捷的提示組件,它的特色就是使用便捷,好比
Toast.makeText(mContext, "123", Toast.LENGTH_SHORT).show();
這樣的一句代碼就能夠給出用戶一個很友好的提示。
若是想作出複雜的交互功能,這些就不是Toast的定位了,須要自定義PopupWindow或者AlertDialog來實現,它們的定位在此。