用過Android 中Toast的童鞋們都知道,Toast只能設置兩種時間,即Toast.LENGTH_SHORT和Toast.LENGTH_LONG。而很多情況下這兩種固定長度的時間並不能很好滿足應用需求,所以我們必須自己控制時間。
聰明的程序猿們還是想出了不少辦法,儘管Android在toast對象偷偷放入了隊列(在調用show()的時候),我們可以通過handle和timer結合的機制來控制,比如下面代碼段:
- handler = new Handler(){
- public void handleMessage(Message message)
- {
- switch (message.what)
- {
- case 1:
- try
- {
- Object obj = message.obj;
- Method method = obj.getClass().getDeclaredMethod("hide", null);
- method.invoke(obj, null);
- }
- catch (Exception e)
- {
- }
- }
- }
- };
- Timer toastTimer = new Timer(true);
- TimerTask toastTT = new TimerTask() {
- @Override
- public void run() {
- // TODO Auto-generated method stub
- Message message = new Message();
- message.what = 1;
- Toast tt = Toast.makeText(m_App.getActivity(), "test", Toast.LENGTH_SHORT);
- tt.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 50);
- Field field = null;
- field.setAccessible(true);
- try {
- field = tt.getClass().getDeclaredField("mTN");
- } catch (SecurityException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (NoSuchFieldException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Object obj = null;
- try {
- obj = field.get(tt);
- } catch (IllegalArgumentException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- message.obj = obj;
- handler.sendMessage(message);
- }
- };
- toastTimer.schedule(toastTT, 800);
- toastTimer.purge();
大致思路是這樣,但是很可惜,Method method = obj.getClass().getDeclaredMethod("hide", null); 這種方法在4.0中已經不適用了。所以在4.0中我們利用這種思路,可以採用更爲簡單的辦法。
- //首先定義全局變量mToast已經顯示和隱藏函數
- private Toast mToast;
- public void showToast(String text) {
- if(mToast == null) {
- mToast = Toast.makeText(m_App.getActivity(), text, Toast.LENGTH_SHORT);
- } else {
- mToast.setText(text);
- mToast.setDuration(Toast.LENGTH_SHORT);
- }
- mToast.show();
- }
- public void cancelToast() {
- if (mToast != null) {
- mToast.cancel();
- }
- }
- //然後調用顯示函數並向handler發消息
- showToast(“test toast”);
- Message delayMsg = m_Handler.obtainMessage(AIRPLAY_MESSAGE_HIDE_TOAST);
- m_Handler.sendMessageDelayed(delayMsg, AIRPLAY_TOAST_DISPLAY_TIME);
其中的AIRPLAY_TOAST_DISPLAY_TIME 就是我們想要Toast顯示的時間長度了!
- //最後在handler中處理消息
- private Handler m_Handler = new Handler()
- {
- @Override
- public void handleMessage(Message msg) {
- // TODO Auto-generated method stub
- switch(msg.what)
- {
- case 0:
- break;
- case AIRPLAY_MESSAGE_HIDE_TOAST :
- {
- cancelToast();
- break;
- }