我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android超实用的Toast提示框优化分享

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android超实用的Toast提示框优化分享

前言

相信每位Android开发者都用过

Toast
,都知道是弹出消息的。类似于js里面的
alert
,C#里面的
MesageBox
。当然android里面也有
dialog
dialog
是有焦点的,可与用户交互。而
toast
是没有焦点的,时间到了自动消失,不能回应用户的交互,下面就跟大家分享下Android中
Toast
提示框的优化方法。

先看下源码:


public class Toast { 
 public static final int LENGTH_SHORT = 0; 
 public static final int LENGTH_LONG = 1; 
  
 public Toast(Context context) { 
  ... 
  //获取系统内置的toast_y_offset常量值 
  mTN.mY = context.getResources().getDimensionPixelSize( 
    com.android.internal.R.dimen.toast_y_offset); 
  mTN.mGravity = context.getResources().getInteger( 
    com.android.internal.R.integer.config_toastDefaultGravity); 
 } 
  
 public void show() { 
  //如果mNextView为空,即没有设置view 
  if (mNextView == null) { 
   throw new RuntimeException("setView must have been called"); 
  } 
  //通过系统服务,获取通知管理器。看来这是使用系统通知? 
  INotificationManager service = getService(); 
  String pkg = mContext.getOpPackageName(); 
  TN tn = mTN; 
  tn.mNextView = mNextView; 
  try { 
   service.enqueueToast(pkg, tn, mDuration); 
  } catch (RemoteException e) { 
   // Empty 
  } 
 } 
  
 public void cancel() { 
  mTN.hide(); 
  try { 
   getService().cancelToast(mContext.getPackageName(), mTN); 
  } catch (RemoteException e) { 
   // Empty 
  } 
 } 
  
 public void setView(View view) { 
  mNextView = view; 
 } 
  
 public void setDuration(@Duration int duration) { 
  mDuration = duration; 
 } 
  
 public void setMargin(float horizontalMargin, float verticalMargin) { 
  mTN.mHorizontalMargin = horizontalMargin; 
  mTN.mVerticalMargin = verticalMargin; 
 } 
  
 public void setGravity(int gravity, int xOffset, int yOffset) { 
  mTN.mGravity = gravity; 
  mTN.mX = xOffset; 
  mTN.mY = yOffset; 
 } 
  
 public static Toast makeText(Context context, CharSequence text, @Duration int duration) { 
  Toast result = new Toast(context); 
  LayoutInflater inflate = (LayoutInflater) 
    context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
  //包含了一个默认的TextView,这个textview的布局位置在 
com.android.internal.R.layout.transient_notification,可以去查看下内容 
  View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null); 
  TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message); 
  tv.setText(text); 
  result.mNextView = v; 
  result.mDuration = duration; 
  return result; 
 } 
  
 public void setText(CharSequence s) { 
  if (mNextView == null) { 
   throw new RuntimeException("This Toast was not created with Toast.makeText()"); 
  } 
   
  TextView tv = (TextView) mNextView.findViewById(com.android.internal.R.id.message); 
  if (tv == null) { 
   throw new RuntimeException("This Toast was not created with Toast.makeText()"); 
  } 
  tv.setText(s); 
 } 
 static private INotificationManager getService() { 
  if (sService != null) { 
   return sService; 
  } 
  //获取远程的通知服务 
  sService = INotificationManager.Stub.asInterface(ServiceManager.getService("notification")); 
  return sService; 
 } 
 //TN是一个瞬态通知的子类,里面包含显示和隐藏两个任务对象 
 private static class TN extends ITransientNotification.Stub { 
  final Runnable mShow = new Runnable() { 
   @Override 
   public void run() { 
    handleShow(); 
   } 
  }; 
  final Runnable mHide = new Runnable() { 
   @Override 
   public void run() { 
    handleHide(); 
    // Don't do this in handleHide() because it is also invoked by handleShow() 
    mNextView = null; 
   } 
  }; 
  //出现Handler了哦 
  final Handler mHandler = new Handler(); 
   
  @Override 
  public void show() { 
   if (localLOGV) Log.v(TAG, "SHOW: " + this); 
   //handler发送异步任务了 
   mHandler.post(mShow); 
  } 
   
  @Override 
  public void hide() { 
   if (localLOGV) Log.v(TAG, "HIDE: " + this); 
   mHandler.post(mHide); 
  } 
  //... 
 } 
} 

通过上面的源码解读,了解到有远程通知,

handler
异步任务等信息,不多说,自己看。

重点是toast的用法:

1、直接调用makeText静态方法即可,返回的是Toast对象,最后别忘了调用show方法显示:


Toast.makeText(context, text, duration).show(); 



Toast toast = Toast.makeText(context, text, duration); 
pre name="code" class="html"> toast.setView(view); 
toast.setText(s); 
toast.setGravity(gravity, xOffset, yOffset); 
toast.setDuration(duration); 
toast.show();

2、还可以使用new的方式创建,别忘了setView()方法:


Toast toast = new Toast(); 
toast.setView(view); 
toast.setText(s); 
toast.setGravity(gravity, xOffset, yOffset); 
toast.setDuration(duration); 
toast.show(); 

以上这些都不值得一提,很简单。

在开发过程中,有这样的需求:在项目总,我们偷懒,想连串

toast
出多个变量的值或者其他任务,可在操作手机时直观可见。问题来了,弹出是无论我们的操作有多快,这些
toast
内容都是一个跟着一个显示,没办法快进。哪怕我们玩完了,退出了app,它还在弹。怎么办?有没有办法让
toast
的内容与我们的操作同步,快速反应?


public class T { 
 private static Toast toast; 
 public static void show(Context context, String msg) { 
  if (toast == null) { 
   toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT); 
  } else { 
   toast.setText(msg); 
  } 
  toast.show(); 
 } 
} 

单例模式,每次创建

toast
都调用这个类的
show
方法,
Toast
的生命周期从
show
开始,到自己消失或者
cancel
为止。如果正在显示,则修改显示的内容,你持有这个对象的引用,当然可以修改显示的内容了。若每次你都
makeText
或者
new
一个
toast
对象,即每次通过
handler
发送异步任务,调用远程通知服务显示通知,当然是排队等待显示了。

结束语

以上就是Android中Toast提示框优化的全部内容,希望对大家开发Android能有所帮助,如果有大家有疑问可以留言交流。

您可能感兴趣的文章:Android实现简单的popupwindow提示框Android中仿IOS提示框的实现方法Android使用Toast显示消息提示框IOS 仿Android吐司提示框的实例(分享)Android 自定义一套 Dialog通用提示框 (代码库)Android仿IOS自定义AlertDialog提示框Android仿QQ、微信聊天界面长按提示框效果Android仿百度谷歌搜索自动提示框AutoCompleteTextView简单应用示例Android实现Toast提示框图文并存的方法Android编程之自定义AlertDialog(退出提示框)用法实例flutter Toast实现消息提示框


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android超实用的Toast提示框优化分享

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android超实用的Toast提示框优化分享

前言 相信每位Android开发者都用过Toast,都知道是弹出消息的。类似于js里面的alert,C#里面的MesageBox。当然android里面也有dialog,dialog是有焦点的,可与用户交互。而toast是没有焦点的,时间到
2022-06-06

Android实现Toast提示框图文并存的方法

本文实例讲述了Android实现Toast提示框图文并存的方法。分享给大家供大家参考,具体如下: 程序如下:import android.app.Activity; import android.graphics.Color; import
2022-06-06

Android中使用Toast.cancel()方法优化toast内容显示的解决方法

产品在测试过程中发现一个bug,就是测试人员不停的疯狂的点击某个按钮,触发了toast以后,toast内容会一直排着队的显示出来,不能很快的消失。这样可能会影响用户的使用。 看到Toast有一个cancel()方法: 代码如下:void c
2022-06-06

android 弹出提示框的使用(图文实例)

代码如下://删除全部 else if(id==R.id.btnDelet){ new AlertDialog.Builder(this).setTitle("删除提示框").setMessage("确认删除该数据?").setPositi
2022-06-06

PyCharm 实用技巧分享:优化编辑器的字体大小

PyCharm 实用技巧分享:字体大小调整攻略PyCharm 是一款功能强大的 Python 集成开发环境(IDE),广受开发者欢迎。然而,有时候我们可能会觉得编辑器默认的字体大小不够舒适或者不符合个人喜好,需要进行调整。本文将分享 Py
PyCharm 实用技巧分享:优化编辑器的字体大小
2024-02-25

layui table组件性能优化策略分享(提升layui table组件性能的实用建议)

本文介绍了6种提升Layuitable组件性能的实用策略:减少数据量、优化数据结构、减少DOM操作、优化算法、使用CDN以及其他优化措施。通过合理应用这些策略,可以显著提升组件性能,优化用户体验。文中还提供了优化步骤示例,指导开发者有效实施性能优化。
layui table组件性能优化策略分享(提升layui table组件性能的实用建议)
2024-04-02

5个超实用的Python自动化测试框架分别是什么

5个超实用的Python自动化测试框架分别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。随着技术的进步和自动化技术的出现,市面上出现了一些自动化测试框架。只需要进行一些适
2023-06-05

【数据库优化实战案例】分享我优化数据库的经验,让你少走弯路,快速提升性能!

本文分享了优化数据库的经验,包括数据库设计、索引优化、查询优化等内容,帮助读者快速提升数据库性能。
【数据库优化实战案例】分享我优化数据库的经验,让你少走弯路,快速提升性能!
2024-02-10

优化pip使用体验的实用提示:使用镜像源来加速下载速度

实用技巧:优化您的pip使用体验——镜像源的使用方法随着Python的广泛应用,pip成为了Python开发中必备的包管理工具。然而,由于众所周知的原因,pip在国内访问官方仓库的速度往往较慢,这给开发者们带来了一定的困扰。为了优化您的p
优化pip使用体验的实用提示:使用镜像源来加速下载速度
2024-01-16

优化网站性能的实战经验分享:从前端到后端的全面应用

从前端到后端:全面优化网站性能的实战经验分享近年来,随着互联网的快速发展,网站的性能优化变得越来越重要。用户对网站的访问速度和响应时间要求越来越高,优化网站性能已经成为每个开发者都应该关注的重要任务。本文将分享一些实战经验,帮助开发者全面
优化网站性能的实战经验分享:从前端到后端的全面应用
2024-02-03

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录