您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)如何在Android中使用Toast自定義顯示時(shí)間,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
目前解決該問題的方法主要有兩個(gè):
1、利用反射原理,通過控制Toast的show()和hide()接口來控制顯示時(shí)間,可參見博客《利用反射機(jī)制控制Toast的顯示時(shí)間》。不過該方法只對(duì)Android4.0以下的系統(tǒng)有效,通過模擬器實(shí)測(cè),也是如此。當(dāng)前系統(tǒng)基本都在Android4.0以上,該方法過于老舊。
2、利用WindowManager的addView()方法動(dòng)態(tài)刷屏,可看見博客《Android自定義Toast,可設(shè)定顯示時(shí)間》 。該方法被很多軟件用來顯示浮動(dòng)窗口和圖片的動(dòng)態(tài)懸浮效果,如360手機(jī)軟件和一些手游軟件。在Android4.0上是一種不錯(cuò)的選擇。當(dāng)然,對(duì)于遇到系統(tǒng)默認(rèn)把懸浮窗口功能關(guān)閉的手機(jī),這招可能就不靈了。
通過分析Toast的顯示原理和彈窗控制邏輯,本人借助Handler和Runnable機(jī)制,也成功實(shí)現(xiàn)了對(duì)Toast顯示任意自定義時(shí)長(zhǎng)。代碼是在Toast全屏顯示的基礎(chǔ)上修改而來,貼出如下:
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,測(cè)試代碼如下:
GenericToast mGToast = GenericToast.makeText(this, "I am generic toast", 10 * 1000); mGToast.show();
關(guān)于如何在Android中使用Toast自定義顯示時(shí)間就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。