Android开发之控制Toast的开启与关闭

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

程序执行效果图:

时间: 2024-10-23 17:45:24

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

Android开发中数据连接的开启和关闭

最近在做Android开发的过程中,我想要通过代码来实现数据连接的开启和关闭,最初我将目标锁定为ConnectivityManager类,但是在翻阅了Android官方API后并没有找到相关的方法,如图1. 图1 但是据说Android的一些类的某些方法的API是非公开的,所以我又做了如下尝试,获得ConnectivityManager在加载时的Class对象,并查看了其中的方法,代码如下: 1 ConnectivityManager connectivityManager = null; 2

Android开发之控制手机音频

本实例通过MediaPlayer播放一首音乐并通过AudioManager控制手机音频,关于AudioManager的详解可参照:Android开发之AudioManager(音频管理器)详解 程序运行效果图: 实例代码: package com.jph.audiomanagerdemo; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Bundle; import an

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

打开手机点击:设置 选择:关于手机 在详情里面找到:版本号,然后不断地点击那个版本号. 然后返回一步 再选择设置里面的:辅助功能 再选择辅助功能里面的:开发者选项 进入开发者选项后,选择打开两项:一是:开启开发者选项,二是:USB调试 设置好后,手机与电脑用数据线连起来,就可以在本机查看运行Android代码的效果了. 原文地址:https://www.cnblogs.com/tszr/p/12016527.html

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

目标: 板子上有个进程需要通过读取gpio的值, 当gpio值为1 时, 开启指定的进程,当gpio为0时, 杀掉这个指定的进程. #include <stdio.h> int main() { FILE *pfile; while (1){ const char * FILEPATH = "/sys/class/gpio/gpio26/value"; pfile = fopen(FILEPATH, "r"); if (pfile == NULL) {

Android开发中模拟Home键操作和关闭手机软键盘

1,在点击返回时,不想退出应用,直接模拟HOME键操作,可以写在onKeyDown事件中,也可以写在其它自己想要实现的地方: Intent intent = new Intent(Intent.ACTION_MAIN); // 创建一个新的任务栈(这个必须要写) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addCategory(Intent.CATEGORY_HOME); this.startActivity(intent);

Android开发-API指南-&lt;instrumentation &gt;

<instrumentation> 英文原文:http://developer.android.com/guide/topics/manifest/instrumentation-element.html 采集(更新)日期:2014-7-1 搬迁自原博客:http://blog.sina.com.cn/s/blog_48d491300100zmui.html 语法: <instrumentation android:functionalTest=["true" | &

Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制

一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/files/LoginTest.txt------/data/data/(包名)/files/(文件名) 导出的文件内容: 三.实现代码 新建一个Android 工程.这里我选择的是2.1即API 7,进行开发的,其它都是默认下一步下一步即可. /datasave/res/layout/activity

Android 应用开发耗电量控制。。

当程序启动手机越多的模块,那耗电就越快 当你的程序运行时只占用CPU的时候,这时候耗电量是最少的. 当然这时候如果cpu的运行速度很慢那是最好的.. 程序耗电量控制首要从下面3个方面抓起: 1.频繁的I/O操作(启动本地外部存储模块和网络通信模块) 2.同时开过多的线程运行(cpu模块). 3.频繁的内存分配以及产生的内存碎片(频繁使用内存模块) 减少I/O操作: 判断是不是连上了wifi或者是不是存在可用的网络,假如不符合条件,就不要发动网路通信. 使用压缩来减少网络中传输的数据. 在读写本地

Android开发之即时显示Toast

Android开发中,Toast经常被用到,但如果想连续弹出Toast,总是要等到第一个Toast显示完才能开始显示第二个Toast,不能及时的反馈给用户信息,没有良好的用户体验, 因此可以用代码实现在弹出下一个Toast之前,将上一个Toast关闭,来显示正确的信息,代码如下: 1.先写一个Toast的成员变量 Toast toast; 2.在onCreate中初始化一个Toast的实例 toastShow("",Toast.LENGTH_LONG,this); 3.需要自定义一个方