开发这个程序之前先解释一下,为什么Toast信息提示框在显示一定时间后会自己主动消失?由于在Android系统中有一个Toast队列,系统会依次从这个队列中取出一个Toast,并显示它。在显示了指定时间之后,便关闭它。那么可不能够让Toast信息提示框一直显示呢?这个要求对于Toast来说有点强人所难了,由于,Toast本身并没有提供这个功能。那么怎么才干让Toast一直显示,并在我们的控制之下关闭呢?代码是死的,人是活的。以下就叫代码说话:

看一下Toast的show方法的源代码:

public void show() {
if (mNextView == null) {
throw new RuntimeException("setView must have been called");
}
INotificationManager service = getService();
String pkg = mContext.getPackageName();
TN tn = mTN;
tn.mNextView = mNextView;
try {
service.enqueueToast(pkg, tn, mDuration);
} catch (RemoteException e) {
// Empty
}
}

在上面的代码中Toast已经告诉我们了,它本身并不负责信息提示框的显示与关闭,它仅仅是将Toast增加到系统的Toast队列中,再由系统依据Toast队列来显示和关闭Toast信息提示框。如今我们能够做一个大胆的判断,既然Toast的show方法是将Toast放到系统的Toast队列中,那么我们就不使用show方法,我们自己来控制Toast的显示与关闭。

查看Toast类源代码能够找到一个TN类,该类是Toast的一个内嵌类。在TN类中有个show方法,系统是从Toast队列中获得Toast对象之后,利用TN对象的show方法显示Toast再利用TN.hide方法关闭Toast。假设我们能够获取TN对象那么就能控制Toast的显示与关闭。但TN被声明成private,外部无法訪问。只是Toast类中有个mTN对象,尽管它不是我public但我们能够通过Java反射技术来訪问该对象。mTN会在创建Toast对象时初始化。所以,仅仅要获得mTN对象也就获得了TN对象。以下代码显示了一个永不关闭的Toast信息提示框。

Toast toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
//设置Toast的显示位置
toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0);
try
{
//通过反射技术,从toast对象中获取mTN对象
Field field = toast.getClass().getDeclaredField("mTN");
field.setAccessible(true);
obj = field.get(toast);
//从TN对象中获得show方法
Method method = obj.getClass().getDeclaredMethod("show", null);
//调用TN对象的show方法来显示Toast信息提示框
method.invoke(obj, null);
}
catch (Exception e)
{
}

上面代码先通过事先创建好的Toast对象获得mTN对象,然后在利用反射技术获得TN对象的show方法。

关闭Toast的方法和显示Toast的方法类似,仅仅须要获得hide方法就可以。

Method method = obj.getClass().getDeclaredMethod("hide", null);
method.invoke(obj, null);

程序执行效果图:

Android开发之控制Toast的开启与关闭的更多相关文章

  1. Android中如何监听GPS开启和关闭

    转自 chenming 原文 Android中如何监听GPS开启和关闭   摘要: 本文简单总结了如何监听GPS开关的小技巧 有时需要监听GPS的开关(这种需求并不多见).实现的思路是监听代表 GPS ...

  2. nRF51822之app_button控制uart的开启和关闭

    为什么要使用app_button来控制uart的开启和关闭 还是先上datesheet中uart开启的时候需要HFCLK,需要消耗大量大电流.所以在我们需要的时候需要通过io来通知nrf51822开启 ...

  3. Android开发之自定义Toast(带详细注释)

    因为工作需求,所以自己研究了自定义Toast,这里做出总结: 在此之前有一点需要提前说明:Toast与其他组件一样,都属于UI界面中的内容,因此在子线程中无法使用Toast弹出提示内容,如果强行在子线 ...

  4. Android开发之控制摄像头拍照

    如今的手机一般都会提供相机功能,有些相机的镜头甚至支持1300万以上像素,有些甚至支持独立对焦.光学变焦这些仅仅有单反才有的功能,甚至有些手机直接宣传能够拍到星星.能够说手机已经变成了专业数码相机.为 ...

  5. Android开发之控制手机音频

    本实例通过MediaPlayer播放一首音乐并通过AudioManager控制手机音频.关于AudioManager的具体解释可參照:Android开发之AudioManager(音频管理器)具体解释 ...

  6. Android开发UI之Toast的使用

    Toast,A toast provides simple feedback about an operation in a small popup. 对于操作提供一个简单反馈信息. 官网链接:htt ...

  7. Android开发_控制硬加速hardwareAccelerated

    控制硬加速 hardwareAccelerated也是一种优化的手段 从Android3.0 (API level11)开始,Android的2D显示管道被被设计得更加支持硬加速了.硬加速使用GPU承 ...

  8. 吴裕雄--天生自然Android开发学习:魅蓝3开启USB调试

    打开手机点击:设置 选择:关于手机 在详情里面找到:版本号,然后不断地点击那个版本号. 然后返回一步 再选择设置里面的:辅助功能 再选择辅助功能里面的:开发者选项 进入开发者选项后,选择打开两项:一是 ...

  9. 通过gpio控制一个进程开启或关闭

    目标: 板子上有个进程需要通过读取gpio的值, 当gpio值为1 时, 开启指定的进程,当gpio为0时, 杀掉这个指定的进程. #include <stdio.h> int main( ...

随机推荐

  1. 对ESB概念的理解(转)

    http://www.ibm.com/developerworks/cn/webservices/0811_magy_esb/ 什么是 ESB?ESB 严格来说不是某一个产品,而是一种框架,设计模式. ...

  2. Java AIO 入门实例(转)

    Java7 AIO入门实例,首先是服务端实现: 服务端代码 SimpleServer: public class SimpleServer { public SimpleServer(int port ...

  3. 【C语言探索之旅】 第二课:工欲善其事,必先利其器

    内容简介 1.课程大纲 2.第一部分第二课:工欲善其事,必先利其器 3.第一部分第三课预告:你的第一个程序 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C ...

  4. [原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略

    原文:[原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略 .NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略 前言:之前的讨论一直关注在怎么从D ...

  5. [原创].NET 分布式架构开发实战五 Framework改进篇

    原文:[原创].NET 分布式架构开发实战五 Framework改进篇 .NET 分布式架构开发实战五 Framework改进篇 前言:本来打算这篇文章来写DAL的重构的,现在计划有点改变.之前的文章 ...

  6. IOS开发——手动设置屏幕旋转

    在移动开发过程.您可能需要跨越看看你的手机.有可能是所有的接口必须跨越,有可能是一个交叉通过电话,当用户当,你的接口也希望他能跨越.还有可能的是,界面的一部分需要被侧向显示.视情况而定,有不同的方法来 ...

  7. oracle查看经常使用的系统信息

    总结了查看oracle数据库的经常使用sql ,有助于分析优化出一个健壮的系统程序来. 1.当前的数据库连接数: select count(*) from v$process 2.数据库同意的最大连接 ...

  8. ios崩溃日志1

    Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not loa ...

  9. MEF初体验之八:过滤目录

    当在使用子容器的时候,基于某些具体标准来过滤目录可能是重要的.例如,基于部件的创建策略来过滤是很常见的.下面的代码片段演示了如何构建这种特别方法: var catalog = new Assembly ...

  10. js 执行一个字符串类型的函数

    两种方法,一种是加括号一种是加叹号,new Function()的方法没有成功. var a = "function(args){console.log(args)}" undef ...