这篇文章将为大家详细讲解有关如何在Android中使用Toast自定义显示时间,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
目前解决该问题的方法主要有两个:
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();
关于如何在Android中使用Toast自定义显示时间就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。