国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android Toast自定義顯示時間

2019-10-21 21:39:54
字體:
來源:轉載
供稿:網友

Toast是Android中使用頻率較高的彈窗提示手段,使用起來簡單、方便。常規使用方法這里不做說明,繼前一篇博客《Android中Toast全屏顯示》 ,其中拋磚引玉的給出一個簡單的實現Toast全屏顯示的方法后,發現無法控制Toast的顯示時長。雖然Toast中有setDuration(int duration)接口,但是跟蹤代碼發現,設置的時間沒起作用,只有系統默認的兩個時間LENGTH_DURATION = 3500毫秒,SHORT_DURATION = 2000毫秒。也就是說,無論我們設置多長時間,最終影響Toast彈窗時間的只有Toast.LENGTH_LONG和Toast.LENGTH_SHORT兩個參數。

目前解決該問題的方法主要有兩個:

1、利用反射原理,通過控制Toast的show()和hide()接口來控制顯示時間,可參見博客《利用反射機制控制Toast的顯示時間》。不過該方法只對Android4.0以下的系統有效,通過模擬器實測,也是如此。當前系統基本都在Android4.0以上,該方法過于老舊。

2、利用WindowManager的addView()方法動態刷屏,可看見博客《Android自定義Toast,可設定顯示時間》 。該方法被很多軟件用來顯示浮動窗口和圖片的動態懸浮效果,如360手機軟件和一些手游軟件。在Android4.0上是一種不錯的選擇。當然,對于遇到系統默認把懸浮窗口功能關閉的手機,這招可能就不靈了。

通過分析Toast的顯示原理和彈窗控制邏輯,本人借助Handler和Runnable機制,也成功實現了對Toast顯示任意自定義時長。代碼是在Toast全屏顯示的基礎上修改而來,貼出如下:

package com.dls.nltest; import android.content.Context;import android.os.Handler;import android.util.DisplayMetrics;import android.util.Log;import android.view.Gravity;import android.view.WindowManager;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;import android.widget.LinearLayout.LayoutParams; public class GenericToast{ private static final String TAG = "GenericToast";  private static final int TOAST_TEXTSIZE = 20;  /** {@link Toast#LENGTH_SHORT} default time is 3500ms */ private static final int LENGTH_SHORT_TIME = 2000;  private static Context mContext = null;  private static Toast mToast = null; private static TextView mTextView = null; private static int mDuration = 0; private static CharSequence mText = null;  private Handler mHandler = new Handler();  private GenericToast(Context context) { mContext = context; }  public static GenericToast makeText(Context context, CharSequence text, int duration){ GenericToast instance = new GenericToast(context); mContext = context; mDuration = duration; mText = text; return instance; }  private static void getToast(Context context, CharSequence text){ mToast = Toast.makeText(context, null, Toast.LENGTH_LONG); mToast.setGravity(Gravity.CENTER, 0, 0); LinearLayout toastView = (LinearLayout)mToast.getView();  // Get the screen size with unit pixels. WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics outMetrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics);  mTextView = new TextView(context); LayoutParams vlp = new LayoutParams(outMetrics.widthPixels,        outMetrics.heightPixels);  vlp.setMargins(0, 0, 0, 0); mTextView.setLayoutParams(vlp); mTextView.setTextSize(TOAST_TEXTSIZE); mTextView.setText(text); mTextView.setGravity(Gravity.CENTER); toastView.addView(mTextView); }  /** * Before call this method, you should call {@link makeText}. * * @return Toast display duration. */ public int getDuration(){ return mDuration; }  public void show(){ Log.d(TAG, "Show custom toast"); mHandler.post(showRunnable); }  public void hide(){ Log.d(TAG, "Hide custom toast"); mDuration = 0; if(mToast != null){ mToast.cancel(); } }  private Runnable showRunnable = new Runnable(){ @Override public void run() { if(mToast != null){ mTextView.setText(mText); }else{ getToast(mContext, mText); } if(mDuration != 0){ mToast.show(); }else{ Log.d(TAG, "Hide custom toast in runnable"); hide(); return; }  if(mDuration > LENGTH_SHORT_TIME){ mHandler.postDelayed(showRunnable, LENGTH_SHORT_TIME); mDuration -= LENGTH_SHORT_TIME; }else{ mHandler.postDelayed(showRunnable, mDuration); mDuration = 0; } } };}

Toast彈窗10s,測試代碼如下:

GenericToast mGToast = GenericToast.makeText(this, "I am generic toast", 10 * 1000);mGToast.show();

如果需要終止彈窗,只要在需要的地方調用hide()即可。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辰溪县| 岱山县| 堆龙德庆县| 贡嘎县| 绥江县| 昌平区| 黄平县| 祁东县| 定兴县| 米泉市| 平安县| 嵊泗县| 井冈山市| 垫江县| 哈尔滨市| 乌兰浩特市| 定结县| 香格里拉县| 抚宁县| 奈曼旗| 南投市| 康保县| 衡阳县| 和静县| 鹤峰县| 浙江省| 麻江县| 绥化市| 陕西省| 湟源县| 屏东市| 鹰潭市| 峨眉山市| 台中县| 岫岩| 宜阳县| 阿拉善右旗| 舟曲县| 徐汇区| 张家港市| 苍溪县|