Toast是Android中使用频率较高的弹窗提示手段,使用方便。 正常使用方法在此不再赘述,接上一篇博客《Android中Toast全屏显示》,其中展示了如何轻松实现Toast全屏显示,发现无法控制Toast的显示时间。 Toast具有setduration(intduration )接口,但在跟踪代码中,设置的时间不起作用,系统的缺省时间为LENGTH_DURATION=3500毫秒,short 也就是说,不管设置了多长时间,最终只有两个参数影响Toast.LENGTH_LONG和Toast.LENGTH_SHORT。
目前,解决这个问题的方法主要有两种。
1、关于如何利用反射原理,通过控制Toast的show ()和hide ()界面来控制显示时间,请参考博客《利用反射机制控制Toast的显示时间》。 但是,该方法只对Android4.0以下的系统有效,用模拟器实测也是如此。 现在的系统几乎都是安卓4.0以上,这个方法太旧了。
2、WindowManager添加视图)方法动态刷新屏幕,即可查看博客《Android自定义Toast,可设定显示时间》。 该方法已被许多软件用于显示浮动窗口和图像的动态悬浮效果,包括360手机软件和一些手游软件。 在安卓4.0上是个不错的选择。 当然,如果系统遇到默认关闭浮动窗口功能的手机,这一招可能就不灵了。
通过分析Toast的显示原理和弹匣控制逻辑,本人利用Handler和Runnable机制,也成功地在Toast上显示了任意定制时间。 代码根据Toast的全屏显示进行了修改,发布如下。
package com.dls.nltest;
import android.content.Context;
import android.os.Handler;
import Android.util.display metrics;
import android.util.Log;
import android.view.Gravity;
import Android.view.window manager;
import Android.widget.linear layout;
import android.widget.TextView;
import android.widget.Toast;
import Android.widget.linear layout.layout params;
公共类通用类{
privatestaticfinalstringtag=' generic toast ';
privatestaticfinalinttoast _ text size=20;
/* { @ link toast # length _ short } defaulttimeis 3500 ms * /
privatestaticfinalintlength _ short _ time=2000;
privatestaticcontextmcontext=null;
private static Toast mToast=null;
privatestatictextviewmtextview=null;
private static int mDuration=0;
privatestaticcharsequencemtext=null;
privatehandlermhandler=new handler (;
privategenerictoast (上下文上下文)
mContext=context;
}
publicstaticgenerictoastmaketext (上下文上下文,CharSequence text,int duration ) {
generictoastinstance=newgenerictoast (context );
mContext=context;
mDuration=duration;
mText=text;
返回实例;
}
privatestaticvoidgettoast (上下文上下文,CharSequence text ) {
mtoast=toast.maketext(context,null,Toast.LENGTH_LONG );
m toast.set gravity (gravity.center,0,0 );
linearlayouttoastview=(linear layout ) mToast.getView );
//getthescreensizewithunitpixels。
windowmanagerWM=(windowmanager ) context.getsystemservice (context.window _ service );
displaymetricsoutmetrics=newdisplaymetrics (;
wm.getDefaultDisplay ().getmetrics ) outmetrics;
mtextview=newtextview(context );
layoutparamsvlp=newlayoutparams (out metrics.width pixels,
outMetrics.heightPixels;
VLP.set margins (0,0,0,0 );
mtextview.setlayoutparams(VLP;
m textview.settext size (toast _ text size );
mtextview.settext(text );
m textview.set gravity (gravity.center );
toastview.addview(mtextview;
}
//*
* Before call this method,you should call {@link makeText}。
*
* @return Toast display duration。
*/
公共获取冗馀
返回m duration;
}
公共void show () }
log.d(tag,' Show custom toast ' );
Mandler.post(showrunnable;
}
公共语音() {
log.d(tag,' Hide custom toast ' );
mDuration=0;
if(mtoast!=null ) {
mToast.cancel (;
}
}
privaterunnableshowrunnable=new runnable {
@Override
公共语音运行(}
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 (;
返回;
}
mdurationlength _ short _ time (if ) {
mhandler.post delayed (show runnable,LENGTH_SHORT_TIME );
mDuration -=LENGTH_SHORT_TIME;
}else{
mhandler.post delayed (show runnable,mDuration;
mDuration=0;
}
}
(;
}
Toast弹匣10s,测试代码如下。
generictoastmgtoast=generic toast.maketext (this,' I am generic toast ',10 * 1000 );
mGToast.show (;
如果需要结束弹夹,只需在需要的地方调用hide ()。
以上是本文的全部内容,希望对大家的学习有帮助。 另外,我希望你能多多支持编剧。
感兴趣的文章:安卓自定义Toast设置显示时间
使用反射机制控制Toast的显示时间
安卓定制Toast显示时间
安卓开发技术的永不关闭的Toast消息框(长时间显示而不是关闭系统) )。
Toast类如何避免显示时间重复