用过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.             }