Android Toast自定義顯示時間
Toast是Android中使用頻率較高的彈窗提示手段,使用起來簡單、方便。常規(guī)使用方法這里不做說明,繼前一篇博客《Android中Toast全屏顯示》 ,其中拋磚引玉的給出一個簡單的實現(xiàn)Toast全屏顯示的方法后,發(fā)現(xiàn)無法控制Toast的顯示時長。雖然Toast中有setDuration(int duration)接口,但是跟蹤代碼發(fā)現(xiàn),設置的時間沒起作用,只有系統(tǒng)默認的兩個時間LENGTH_DURATION = 3500毫秒,SHORT_DURATION = 2000毫秒。也就是說,無論我們設置多長時間,最終影響Toast彈窗時間的只有Toast.LENGTH_LONG和Toast.LENGTH_SHORT兩個參數(shù)。
目前解決該問題的方法主要有兩個:
1、利用反射原理,通過控制Toast的show()和hide()接口來控制顯示時間,可參見博客《利用反射機制控制Toast的顯示時間》。不過該方法只對Android4.0以下的系統(tǒng)有效,通過模擬器實測,也是如此。當前系統(tǒng)基本都在Android4.0以上,該方法過于老舊。
2、利用WindowManager的addView()方法動態(tài)刷屏,可看見博客《Android自定義Toast,可設定顯示時間》 。該方法被很多軟件用來顯示浮動窗口和圖片的動態(tài)懸浮效果,如360手機軟件和一些手游軟件。在Android4.0上是一種不錯的選擇。當然,對于遇到系統(tǒng)默認把懸浮窗口功能關閉的手機,這招可能就不靈了。
通過分析Toast的顯示原理和彈窗控制邏輯,本人借助Handler和Runnable機制,也成功實現(xiàn)了對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();
如果需要終止彈窗,只要在需要的地方調(diào)用hide()即可。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android安裝apk文件并適配Android 7.0詳解
這篇文章主要介紹了Android安裝apk文件并適配Android 7.0詳解的相關資料,需要的朋友可以參考下2017-05-05

