Android开发之控制Toast的开启与关闭
来源:互联网 发布:c语言包括哪些 编辑:程序博客网 时间:2024/05/15 14:11
开发这个程序之前先解释一下,为什么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的开启与关闭
- Android开发之控制Toast的开启与关闭
- Android入门开发之设置Toast与Menu的使用
- Android开发技巧:永不关闭的Toast信息框
- Android开发技巧:永不关闭的Toast信息框
- Android开发技巧:永不关闭的Toast信息框
- Android开发技巧:永不关闭的Toast信息框
- 手动控制IIS服务的开启与关闭
- Android开发之Toast
- Android 开发之 Toast
- android开发之Toast
- Android开发之Toast提示的优化
- android开发之Toast的多种应用
- Android开发之Toast的用法
- 利用反射Android开发之开启关闭数据连接实现
- 越狱开发之iOS设备中WiFi信号的开启与关闭
- Android线程开启与关闭
- Android控件开发之Toast
- HDU5867 Water problem
- 材料设计NavigationView简析
- Ubuntu下用luvcview查看摄像设备详细信息
- sqlserver的触发器练习
- 剑指offer题67
- Android开发之控制Toast的开启与关闭
- krpano浏览量+点赞插件(不用数据库,也不用第三方,自己的地盘自己做主)
- 4260: Codechef REBXOR
- 解决undefined reference to `BZ2_bzWriteOpen'
- O
- ECharts颜色渐变、Y轴文字左对齐
- Scala 之 ::: 操作符
- 从github上下载的xadmin源码包安装报错AppRegistryNotReady: Apps aren't loaded yet.
- JQuery_基础入门