Android Toast自定义显示时间

 更新时间:2018年08月28日 10:14:05   作者:harry_helei  
这篇文章主要为大家详细介绍了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字体相关知识总结

    Android字体相关知识总结

    最近接到一个需求,大致内容是:全局替换当前项目中的默认字体,并引入 UI 设计师提供的一些新字体。于是对字体做了些研究,把自己的一些心得分享给大家。注意:本文所展示的系统源码都是基于Android-30 ,并提取核心部分进行分析
    2021-06-06
  • Android带进度条的文件上传示例(使用AsyncTask异步任务)

    Android带进度条的文件上传示例(使用AsyncTask异步任务)

    这篇文章主要介绍了Android带进度条的文件上传示例(使用AsyncTask异步任务),使用起来比较方便,将几个方法实现就行,感兴趣的小伙伴们可以参考一下。
    2016-11-11
  • Android仿淘宝预订日历(18)

    Android仿淘宝预订日历(18)

    这篇文章主要为大家详细介绍了Android仿淘宝预订日历的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Flutter质感设计之模态底部面板

    Flutter质感设计之模态底部面板

    这篇文章主要为大家详细介绍了Flutter质感设计之模态底部面板,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android自定义进度条效果

    Android自定义进度条效果

    这篇文章主要为大家详细介绍了Android自定义进度条效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android简单实现菜单拖拽排序的功能

    Android简单实现菜单拖拽排序的功能

    这篇文章主要介绍了Android简单实现菜单拖拽排序的功能,文章围绕主题展开详细的内容介绍,具有一定的参考价价值,需要的朋友可以参考一下
    2022-07-07
  • Android实现图片九宫格

    Android实现图片九宫格

    这篇文章主要为大家详细介绍了Android实现图片九宫格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Android 实现无网络页面切换的示例代码

    Android 实现无网络页面切换的示例代码

    本篇文章主要介绍了Android 实现无网络页面切换的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • RecycleView实现各种尺寸图片展示

    RecycleView实现各种尺寸图片展示

    这篇文章主要为大家详细介绍了RecycleView实现各种尺寸图片展示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • 解析Android中如何做到Service被关闭后又自动启动的实现方法

    解析Android中如何做到Service被关闭后又自动启动的实现方法

    本篇文章是对在Android中如何做到Service被关闭后又自动启动的方法进行了详细的分析和介绍。需要的朋友参考下
    2013-05-05

最新评论