在网上找到一段显示不会关闭的Toast的代码,是使用Java的反射机制实现的,在Android2.3中可以实现,但是在Android3.0中不起作用,这是为什么呢?
// 先创建一个Toast对象
Toast toast = Toast.makeText(this, "永不关闭的Toast", Toast.LENGTH_LONG);
// 设置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)
{
}

解决方案 »

  1.   

    每个版本源码都可能有改动。那个例子是别人看了源码,在了解了那个类的结构后用反射去改变那个对象的属性,比如说 Field field = toast.getClass().getDeclaredField("mTN");2.3版本下Toast有mTN这个成员变量,到3。0下就不一定有了,或者改名了。于是拿不到了。。
    要保持版本的兼容性最好别用反射。
      

  2.   

    属性名称并没有变化,我现在也没有找到原因。
    TN类的属性在新版本里变为static了,不确定跟这个有没有关系。
    希望有人能给出答案~
      

  3.   

    还有就是在handleshow后边添加了一个跟trySendAccessibilityEvent方法,其中做了一些判断,也有可能跟这个有关系。