免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2044 | 回复: 1
打印 上一主题 下一主题

Toast 在android 4.0中问题解决方案 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-01 17:54 |只看该作者 |倒序浏览
Toast 在android 4.0中问题解决方案






androidandroid 4.0Toast
Toast 在android 4.0中问题解决方案。


自己实现Toast 使用WindowManager 绘制在屏幕上
使用handler计时  消除Toast
可以解决 Toast 在4.0中无法连续触发(在队列中一个个显示,会造成大量延时)   cancel导致的异常(不正常显示、延时显示、不显示)等问题


存在问题:必须使用Activity的context对象创建Toast  所以在service中无法使用
     :有可能会与其他的使用WindowManager的操作产生冲突
  
  
其他方案:Toast源码中是使用WindowManagerImpl来操作的 基本方法一致
但是此类在framework源文件中存在  SDK中却找不到
在网上搜寻资料得知,这个类时隐藏的,要和android源码一起编译才能使用。
目前还不知道怎么弄

  1. package dk.toasttest;

  2. import android.content.Context;
  3. import android.graphics.PixelFormat;
  4. import android.os.Handler;
  5. import android.os.Message;
  6. import android.view.Gravity;
  7. import android.view.WindowManager;
  8. import android.widget.TextView;
  9. import android.widget.Toast;

  10. /**
复制代码
*
* @author DK
* App内所有Toast均使用本类管理
* 每个触发的Toast都会显示
*
* 不存在延迟Toast现象
*/
  1. public class ToastUtil {
  2. public static TextView tv;
  3. public static WindowManager mWindowManager;
  4. public static void showMessage(final Context act, final String msg) {
  5.   showMessage(act, msg, Toast.LENGTH_SHORT);

  6. }

  7. public static void showMessage(final Context act, final int msg) {
  8.   showMessage(act, act.getString(msg), Toast.LENGTH_SHORT);

  9. }

  10. public static void showMessage(Context context,String msg,int Length)
  11. {
  12.   if(tv==null)
  13.   {
  14.    tv=new TextView(context);
  15.    tv.setText("msg");
  16.    tv.setTextSize(24);
  17.    tv.setBackgroundResource(R.drawable.bg_layoutinput_focused);
  18.    tv.setPadding(0, 0, 0, 30);
  19.   }
  20.   
  21.   if(tv.getParent()==null)
  22.   {
  23.   WindowManager.LayoutParams params = new WindowManager.LayoutParams();
  24.   params.gravity = Gravity.BOTTOM;
  25.   params.alpha = 0.65f;
  26.   params.x = 0;

  27.   params.height = WindowManager.LayoutParams.WRAP_CONTENT;
  28.   params.width = WindowManager.LayoutParams.WRAP_CONTENT;
  29.   params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
  30.     | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
  31.     | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
  32.     | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
  33.   params.format = PixelFormat.TRANSLUCENT;
  34.   params.windowAnimations = 0;
  35.   mWindowManager.addView(tv, params);
  36.   handler.sendEmptyMessageDelayed(101, 5000);
  37.   }
  38.   else
  39.   {
  40.    tv.setText(msg);
  41.    handler.removeMessages(101);
  42.    handler.sendEmptyMessageDelayed(101, 5000);
  43.   }
  44. }

  45.   
  46.    static Handler handler =new Handler(){

  47.   @Override
  48.   public void handleMessage(Message msg) {
  49.    super.handleMessage(msg);
  50.    if(tv.getParent()!=null)
  51.    mWindowManager.removeView(tv);
  52.   }
  53.      
  54.      
  55.     };
  56.    
  57.     public static void cancelCurrentToast()
  58.     {
  59.      if(tv!=null && tv.getParent()!=null)
  60.      {
  61.       mWindowManager.removeView(tv);
  62.      }
  63.     }
  64. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-03-01 22:26 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP