博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发之控制Toast的开启与关闭
阅读量:6434 次
发布时间:2019-06-23

本文共 2127 字,大约阅读时间需要 7 分钟。

         开发这个程序之前先解释一下,为什么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);
程序执行效果图:

永不关闭的Toast

转载地址:http://lxqga.baihongyu.com/

你可能感兴趣的文章
python字符串操作实方法大合集
查看>>
Linux学习(十一):不可忽略的Linux支持的文件系统
查看>>
[转]VC++中操作XML(MFC、SDK)
查看>>
WiFi连接风险造成个人信息外泄 网络安全需加强
查看>>
2017(中国)商博会系列介绍之智能生活展
查看>>
eclipse link方式安装 sts(Spring Tool Suite)
查看>>
数据结构思维 第三章 `ArrayList`
查看>>
CentOS6、7编译安装FFmpeg
查看>>
Android项目实战(二十九):酒店预定日期选择
查看>>
PHP IDE phpstorm 常用快捷键
查看>>
蓝牙的未来怎样发展?
查看>>
AI、新材料、5G、智慧城市,未来的社会场景在高交会提前上演
查看>>
Facebook开发的一种数据查询语言——GraphQL:安全概述和测试技巧
查看>>
ECS主动运维2.0,体验升级,事半功倍
查看>>
vim 学习方法
查看>>
php token验证范例
查看>>
WebSocket的C++服务器端实现
查看>>
java中两种添加监听器的策略
查看>>
脑洞成现实!AI系统可提前10s预测地震
查看>>
Page页面生命周期——微信小程序
查看>>