android toast显示时间,Android Toast自定义显示时间
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()即可。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
android toast显示时间,Android Toast自定义显示时间相关推荐
- 一步一步学android之控件篇——ListView自定义显示数据格式
上一篇博客说了ListView的基本使用,这篇将是对ListView的使用进行一个提高,在日常生活中,如果单单给你看一些图片,你可能都不知道这个图片表达的什么意思,但是要是在图片旁边写的备注或者加个名 ...
- android timepicker 不可编辑,iView -- TimePicker 自定义修改时间选择器选择时间面板样式...
期望的最终效果: 为什么要修改期望效果? 项目需要只选择小时,分钟跟秒的不需要,而官方并没有直接相关的小时组件或者是设置显示成小时或分钟或秒的时间选择器,因为自己直接修改样式. 原生js 代码,如下: ...
- Android 自定义带图标Toast,工具方法,Toast自定义显示时间
带图标Toast工具方法1 样式 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:an ...
- android toast 自定义时间,Android Toast自定义显示时间
Toast是Android中使用频率较高的弹窗提示手段,使用起来简单.方便.常规使用方法这里不做说明,继前一篇博客<Android中Toast全屏显示> ,其中抛砖引玉的给出一个简单的实现 ...
- android toast 自定义时间,android自定义Toast设定显示时间
开发android的同学可能会抱怨Toast设定显示的时长无效,只能是Toast.LENGTH_LONG 或者Toast.LENGTH_SHORT 之一,为了解决这些办法,有多种实现方式: 1.使用定 ...
- Android Toast 自定义显示时长
Android Toast 只支持两种时间 LENGTH_SHORT 2 秒,LENGTH_LONG 3.5 秒,但是有场景需要自定义显示时长就会有问题,所以需要自定义实现,下边是自定义的类,通过定时 ...
- Android 自定义Toast实现多次触发只会显示一次toast
#使用场景描述 当我们处于某个场景,例如一个按钮可以触发toast的显示,当你在多次点击按钮时,会多次触发toast的显示.而调用android原生的toast的makeText的方式所生产的toas ...
- Toast拓展--自定义显示时间和动画
Toast拓展–自定义显示时间和动画 我们在Android应用开发中经常会需要在界面上弹出一个对界面操作无影响的小提示框来提示用户一些信息,这时候一般都会使用Android原生的Toast类 Toas ...
- Android问题——解决Toast在APP通知关闭不显示
Android在8.0中针对通知一块在功能上做了较大的改动. Toast被纳入到了通知管理,其实这在Android 4.4(API 19)以上就已经有特别的处理了.只是一般用户不会怎么注意,开发人员也 ...
- android toast有焦点,android – 如何在显示Toast后进行edittext自动对焦?
我有一个EditText,读取13位数的条形码.我想要做的是保持屏幕上显示的虚拟键盘和EditText始终具有焦点.下面的代码让我编写条形码并在按下回车键时搜索产品,并且效果很好.但是如果我输入的条形 ...
最新文章
- 【更新】比较智能的爬取姓名
- c++ 获取时间字符串
- 手写自己的MyBatis框架-SqlSession
- UVA 725 Division(除法)
- Elasticsearch2.3.2创建索引java代码及异常处理
- Page.FindControl方法找不到指定控件的原因
- c语言每条代码的含义,为我解释一下,代码的意思。谢谢了。
- Django框架 day02
- 【BZOJ1257】余数之和sum,数论练习之取值讨论
- 系统登陆后自动注销的解决办法!
- java改变this指向_[Java教程]JavaScript中的this指向
- 学习通下载任务点内的课件
- 下载蓝盒插件_bilibili哔哩哔哩下载助手
- 禁忌搜索算法c语言代码,禁忌搜索算法
- 虚拟服务器软件哪个好,虚拟机软件哪个好?热门虚拟机软件推荐
- 存储程序式计算机特征,冯.诺依曼机模型是以运算器为中心的存储程序式的计算机模型,它由五大部分构成,即运算器、控制器、存储器、输入设备和输出设备...
- 三星固态性能测试软件,三星850 EVO 120G固态硬盘评测——性能测试与保养
- 激光SLAM:LOAM-Livox 算法研究(1) -- 功能包编译与验证
- 陈天桥的大脑在孕育什么新传奇(转)
- 计算机应用基础 制作表格说课稿,使用Word制作表格说课稿.doc
热门文章
- JAFFE表情库介绍
- android 安装apk -99,Android APK 安装适配
- 如何官网下载 IEEE 论文 Latex 和 Word 模板
- android 界面置顶,Android实现界面滚动时顶部部分内容置顶(附源码)
- 微信发ascii_微信翻译竟能识别神秘代码!这里有份超全的彩蛋总结 | 晓技巧
- SPSS之配对样本的T检验
- 学习一下企业管理信息化建设的“诺兰模型”
- Avesta飞秒光纤激光器
- 计算机网络技术计划书,开设计算机网络技术专业项目可研计划书5喜欢就下吧(样例3)...
- 对自我认知四象限理解