澳门太阳集团,太阳集团娱乐网址

    欢迎访问太阳集团娱乐网址~

  1. 加入收藏
  2. 设为主页
  3. 学校简介
北大青鸟

三分钟了解北大青鸟

×
  • 北大青鸟大数据课程
  • 北大青鸟网络工程师
  • 北大青鸟web设计专业
  • 北大青鸟PHP专业
  • 北大青鸟启蒙星课程

安卓技术教程之让你的Toast信息提示框永远显示

责任编辑:027hpedu来源:太阳集团娱乐网址安卓技术教程发布时间:2012-07-17 10:03
导读:安卓技术教程之Toast信息提示框之所以在显示一定时间后会自动关闭,是因为在系统中有一个Toast队列。

  安卓技术教程之Toast信息提示框之所以在显示一定时间后会自动关闭,是因为在系统中有一个Toast队列。系统会依次从队列中取(出队列)一个Toast,并显示它。在显示一段时间后,再关闭,然后再显示下一个Toast信息提示框。直到Toast队列中所有Toast都显示完为止。

  那么有些时候需要这个Toast信息提示框长时间显示,直到需要关闭它时通过代码来控制,而不是让系统自动来关闭Toast信息提示框。不过这个要求对于Toast本身来说有些过分,因为Toast类并没有提供这个功能。虽然如此,但方法总比问题多。通过一些特殊的处理还是可以实现这个功能的,而且并不复杂。 Toast信息提示框需要调用Toast.show方法来显示。下面来看一下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;

  try {

  // 将当前Toast加入到Toast队列

  service.enqueueToast(pkg, tn, mDuration);

  } catch (RemoteException e) {

  // Empty

  }

  }

  show方法的代码并不复杂,可以很容易找到如下的代码。

  service.enqueueToast(pkg, tn, mDuration);

  从上面的代码可以很容易推断出它的功能是将当前的Toast加入到系统的Toast队列中。看到这里,各位读者应该想到。虽然show方法的表面功能是显示Toast信息提示框,但其实际的功能是将Toast加入到队列中,再由系统根据Toast队列来显示Toast信息提示框。那么我们经过更进一步地思考,可以大胆地做出一个初步的方案。既然系统的Toast队列可以显示Toast信息提示框,那么我们为什么不可以自己来显示它呢?这样不是可以自己来控制Toast的信息提示框的显示和关闭了吗!当然,这就不能再调用show方法来显示Toast信息提示框了(因为show方法会将Toast加入队列,这样我们就控制不了Toast了)。

  既然初步方案已拟定,现在就来实施它。先在Toast类找一下还有没有其他的show方法。结果发现了一个TN类,该类是Toast的一个内嵌类。在TN类中有一个show方法。TN是ITransientNotification.Stub的子类。从ITransientNotification和TN类中的show方法初步推断(因为Transient的中文意思是“短暂的”)系统是从Toast队列中获得了Toast对象后,利用TN对象的show方法显示Toast,再利用TN.hide方法来关闭Toast。先声明,这只是假设,我们还不知道这么做是否可行!当然,这也是科学研究的一般方法,先推断或假设,然后再证明推断或假设。

  现在关键的一步是获得TN对象。遗憾的是TN被声明成private类型,外部无法访问。不过别着急。在Toast类中有一个mTN变量。虽然不是public变量,但仍然可以通过反射技术访问该变量。mTN变量会在创建Toast对象时初始化。因此,只要获得mTN变量,就获得了TN对象。下面的代码显示了一个永远不会自动关闭的Toast信息提示框。

  // 先创建一个Toast对象

  Toast toast = Toast.makeText(this, "永不消失的Toast", 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);

  Object obj = field.get(toast);

  // TN对象中获得了show方法

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

  // 调用show方法来显示Toast信息提示框

  method.invoke(obj, null);

  }

  catch (Exception e)

  {

  }

  上面的代码中try{…}catch(…){…}语句中的代码是关键。先利用事先创建好的Toast对象获得了mTN变量。然后再利用反射技术获得了TN对象的show方法。

  关闭Toast和显示Toast的方法类似,只是需要获得hide方法,代码如下:

  try

  {

  // 需要将前面代码中的obj变量变成类变量。这样在多个地方就都可以访问了

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

  method.invoke(obj, null);

  }

  catch (Exception e)

  {

  }

  上面的代码已经很完美地实现了通过代码控制Toast信息提示框显示和关闭的功能。但如果想实现得更完美,可以在Android SDK源代码中找一个叫ITransientNotification.aidl的文件(该文件是AIDL服务定义文件,将在后面详细介绍),并在Android工程的src目录中建一个android.app包,将这个文件放到这个包中。然后ADT会自动在gen目录中生成了一个android.app包,包中有一个ITransientNotification.java文件。由于Android SDK自带的ItransientNotification接口属于内部资源,外部程序无法访问,因此,只能将从Toast对象中获得的mTN变量转换成刚才生成的ITransientNotification对象了。这样就不需要使反射技术获得show和hide方法了。经过改良的显示和关闭Toast信息提示框的代码如下:

  ITransientNotification notification = (ITransientNotification) field.get(toast);

  // 显示Toast信息提示框

  notification.show();

  // 关闭Toast信息提示框

  notification.hide();

  安卓技术教程之让你的Toast信息提示框永远显示的技巧是安卓技术里面很重要的环境,更多安卓技术请返回页进行了解或致电:027-87807717!

本文标题:安卓技术教程之让你的Toast信息提示框永远显示,责任编辑:027hpedu,来源:北大青鸟武汉宏鹏鲁广校,于2012年07月17日10时03分发布于太阳集团娱乐网址。澳门太阳集团宏鹏鲁广校区,是北大青鸟武汉电脑学校,专业IT计算机培训,拥有软件/网络/安卓/Web前端/Java课程.北大青鸟地址:光谷广场鲁巷数码港.电话:027-87807717

专业老师指导

专业老师指导

赵老师

从事IT教育培训十年有余,致力于帮助广大学子找到适合自己的专业。

培训咨询客服

培训咨询客服

陈老师

IT培训专业客服,用自己的真诚解决了无数学子的困惑。

本文地址:
文章标题:
  • 北大青鸟Java软件开发
  • 北大青鸟UI设计课程_零基础可学
  • 北大青鸟动漫设计_武汉设计学校
  • 北大青鸟数字艺术_武汉电脑学校
在线咨询
×
在线咨询更多问题

如您有任何疑问
在线咨询随时为您解答或拨打咨询热线:17740513250

×
  • 姓 名*
  • 手 机*
  • QQ号/微信号
  • 所报学科 *
  • 其他备注
  • 温馨提示:请保持手机畅通,咨询老师将为您提供专属的一对一报名服务。