1. 程式人生 > >[Android]Toast的工具類(- -!)可啪的重複顯示Toast

[Android]Toast的工具類(- -!)可啪的重複顯示Toast

toast本來就是提示使用者資訊用的,首先分析出當前面臨的問題:

1.想顯示多姿多彩的Toast
2.toast重複顯示的問題及解決辦法。

首先解決第一個問題:
Toast可以設定顯示位置,通過.setGravity(Gravity.CENTER, 0, 0);即可解決問題
toast可以設定顯示的時長.setDuration(duration);不要期望使用數字代表時長了,完全無效的,只能用Toast.LENGTH_SHORT 與 Toast.LENGTH_LONG,那我就想手動設定時間怎麼辦…,好吧~~這是一個問題。
可能有同學說了,我想顯示圖片可以麼,答案是完全可以的,你可以放一個你自己的view進行,至於放什麼稀奇古怪的東東,那就隨你了,然後就引出了第一種不重複顯示的方法了,每次有新的就讓舊的toast呼叫cancel()方法,然後在展示新的,這樣每次都可以載入一個新的view了

  public static void buildToast(Context context,String msg,int duration,View mLayout){

      if(mSpecialToast == null){
      mSpecialToast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
      }else{
        mSpecialToast.cancel();
        mSpecialToast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
        mSpecialToast.setGravity(Gravity.CENTER, 0
, 0); mSpecialToast.setDuration(duration); } //將自定義View覆蓋Toast的View mSpecialToast.setView(mLayout); mSpecialToast.show(); }

我們知道toast存在一個cancel()的方法,通過cancel,我們可以將Toast消去,那多次彈框的時候重複cancel()和show()呼叫效率有些低唉,那可以使用setText(Str),將想替換的文字替換即可,然後加一個延遲的限制,防止多次呼叫後出現很久再消失的情況,這就是第二種方法,通過延遲重置的方法替換toast內容。

    //延遲的runnable
 private static Runnable r = new Runnable() {
    public void run() {
      lastMsg = null;
      mTextToast.cancel();
    }
  };

public static void showTextToast(Context mContext, String text, int duration) {
    // 如果為null或者 本次與上次的文字相同,將不進行再次展示;否則移除上次展示的文字,展示最新的文字
    if (TextUtils.isEmpty(text) || TextUtils.equals(text, lastMsg)) {
      return;
    }
    lastMsg = text;
    if (mHandler == null) {
      mHandler = new Handler();
    }
    mHandler.removeCallbacks(r);
    if (mTextToast != null) {
      mTextToast.setText(text);
    } else {
      mTextToast = Toast.makeText(mContext, text, Toast.LENGTH_SHORT);
    }
    mHandler.postDelayed(r, duration);
    mTextToast.show();
  }

來自博主bluewindtalker
其實替換view的方法,也可以通過第二種runnable延遲處理的方法進行操作,這樣可以自定義顯示的toast的佈局了,每次通過setView()的方法替換不同的顯示介面,然後採用第二種延遲的方法即可,但是,有一很重要的點,setView之後就不要setText了,因為view被替換了,所以建議寫出兩個靜態常量的Toast物件進行處理,詳細程式碼就不寫出了,童鞋們可以自己實現下·~~喵