Android4.0中控制Toast時間

用過Android 中Toast的童鞋們都知道,Toast只能設置兩種時間,即Toast.LENGTH_SHORT和Toast.LENGTH_LONG。而很多情況下這兩種固定長度的時間並不能很好滿足應用需求,所以我們必須自己控制時間。

聰明的程序猿們還是想出了不少辦法,儘管Android在toast對象偷偷放入了隊列(在調用show()的時候),我們可以通過handle和timer結合的機制來控制,比如下面代碼段:

  1.  
  2. handler = new Handler(){  
  3.     public void handleMessage(Message message)  
  4.     {  
  5.         switch (message.what)  
  6.         {  
  7.         case 1:  
  8.             try 
  9.             {  
  10.                 Object obj = message.obj;  
  11.                 Method method =  obj.getClass().getDeclaredMethod("hide"null);  
  12.                 method.invoke(obj, null);  
  13.             }  
  14.             catch (Exception e)  
  15.             {  
  16.             }  
  17.         }  
  18.     }  
  19. };  
  20.  
  21. Timer toastTimer = new Timer(true);  
  22. TimerTask toastTT = new TimerTask() {  
  23.       
  24.     @Override 
  25.     public void run() {  
  26.         // TODO Auto-generated method stub  
  27.             Message message = new Message();  
  28.             message.what = 1;  
  29.  
  30.             Toast tt = Toast.makeText(m_App.getActivity(), "test", Toast.LENGTH_SHORT);  
  31.             tt.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 050);  
  32.             Field field = null;  
  33.             field.setAccessible(true);  
  34.             try {  
  35.                 field = tt.getClass().getDeclaredField("mTN");  
  36.             } catch (SecurityException e) {  
  37.                 // TODO Auto-generated catch block  
  38.                 e.printStackTrace();  
  39.             } catch (NoSuchFieldException e) {  
  40.                 // TODO Auto-generated catch block  
  41.                 e.printStackTrace();  
  42.             }  
  43.             Object obj = null;  
  44.             try {  
  45.                 obj = field.get(tt);  
  46.             } catch (IllegalArgumentException e) {  
  47.                 // TODO Auto-generated catch block  
  48.                 e.printStackTrace();  
  49.             } catch (IllegalAccessException e) {  
  50.                 // TODO Auto-generated catch block  
  51.                 e.printStackTrace();  
  52.             }  
  53.             message.obj = obj;  
  54.               
  55.             handler.sendMessage(message);    
  56.     }  
  57. };  
  58.  
  59. toastTimer.schedule(toastTT, 800);  
  60. toastTimer.purge(); 

 

大致思路是這樣,但是很可惜,Method method =  obj.getClass().getDeclaredMethod("hide"null);  這種方法在4.0中已經不適用了。所以在4.0中我們利用這種思路,可以採用更爲簡單的辦法。

 

  1. //首先定義全局變量mToast已經顯示和隱藏函數  
  2. private Toast mToast;  
  3.  
  4.     public void showToast(String text) {  
  5.         if(mToast == null) {  
  6.             mToast = Toast.makeText(m_App.getActivity(), text, Toast.LENGTH_SHORT);  
  7.         } else {  
  8.             mToast.setText(text);         
  9.             mToast.setDuration(Toast.LENGTH_SHORT);  
  10.         }  
  11.         mToast.show();  
  12.     }  
  13.  
  14.     public void cancelToast() {  
  15.             if (mToast != null) {  
  16.                 mToast.cancel();  
  17.             }  
  18.         } 

 

  1. //然後調用顯示函數並向handler發消息  
  2. showToast(“test toast”);  
  3.                 Message delayMsg = m_Handler.obtainMessage(AIRPLAY_MESSAGE_HIDE_TOAST);  
  4.                 m_Handler.sendMessageDelayed(delayMsg, AIRPLAY_TOAST_DISPLAY_TIME); 

其中的AIRPLAY_TOAST_DISPLAY_TIME 就是我們想要Toast顯示的時間長度了!

  1. //最後在handler中處理消息  
  2. private Handler m_Handler = new Handler()  
  3.     {  
  4.  
  5.         @Override 
  6.         public void handleMessage(Message msg) {  
  7.             // TODO Auto-generated method stub  
  8.             switch(msg.what)  
  9.             {  
  10.             case 0:  
  11.                 break;  
  12.             case AIRPLAY_MESSAGE_HIDE_TOAST :  
  13.             {  
  14.                 cancelToast();  
  15.                 break;  
  16.             } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章