使用WindowManager添加自定义视图

在写手机卫士的时候,用户拨打|接听电话需要显示号码归属地,然后出现了一些异常,在此留下记号,希望对麻友们有帮助:

BUG教程

在使用 view = View.inflate(this, R.layout.ui_toast, null);获得View对象后wm.addView出现错误:

10-12 14:29:06.166: E/AndroidRuntime(1268): Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@41087ed8 -- permission denied for this window type

解决办法:

使用另外的方法获取:

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 mDesktopLayout = inflater.inflate(R.layout.volume_panel, null);

完整代码:

LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 mDesktopLayout = inflater.inflate(R.layout.volume_panel, null);
 // 取得系统窗体
 mWindowManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE);
 // 窗体的布局样式
 mLayoutParams = new WindowManager.LayoutParams();
 // 设置窗体显示类型――TYPE_SYSTEM_ALERT(系统提示)
 mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
 // 设置窗体焦点及触摸:
 // FLAG_NOT_FOCUSABLE(不能获得按键输入焦点)
 mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
 // 设置显示的模式
 mLayoutParams.format = PixelFormat.RGBA_8888;
 // 设置对齐的方法
 mLayoutParams.gravity = Gravity.TOP | Gravity.LEFT;
 // 设置窗体宽度和高度
 mLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
 mLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
 // 设置窗体显示的位置,否则在屏幕中心显示
 mLayoutParams.x = 50;
 mLayoutParams.y = 50;
 mWindowManager.addView(mDesktopLayout, mLayoutParams);

 

问题总结

这两种方式显示出来的窗口都不会激发当前Activity的onPause()事件。据说还可以先一个窗口风格的Activity,不过显示时会激发当前窗口的onPause()事件,具体咋样没试过。

推荐风格

 

    
      
        @null  
        true  
        false  
        true  
          
        false  
        0.6  
      

 

OK,谢谢关注破晓博客


你可能感兴趣的:(使用WindowManager添加自定义视图)