使用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()事件。详细咋样没试过。

推荐风格

 

<?xml version="1.0" encoding="utf-8"?

>  <resources>       <style           name="selectorDialog"           parent="@Android:style/Theme.Dialog">           <item name="android:windowFrame">@null</item><!--边框-->           <item name="android:windowIsFloating">true</item><!--是否浮如今activity之上-->           <item name="android:windowIsTranslucent">false</item><!--半透明-->           <item name="android:windowNoTitle">true</item><!--无标题-->           <!--<item name="android:windowBackground">@drawable/selector_dialog_bg</item>背景透明-->           <item name="android:backgroundDimEnabled">false</item><!--模糊-->           <item name="android:backgroundDimAmount">0.6</item>       </style>  </resources>

 

OK,谢谢关注破晓博客


版权声明:本文博客原创文章。博客,未经同意,不得转载。





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4734812.html,如需转载请自行联系原作者


相关文章
|
XML Android开发 数据格式
进入Activity时,为何页面布局内View#onMeasure会被调用两次?
进入Activity时,为何页面布局内View#onMeasure会被调用两次?
|
Web App开发 API 容器
CoordinatorLayout+AppBarLayout实现上滑隐藏ToolBar-Android M新控件
CoordinatorLayout+AppBarLayout实现上滑隐藏ToolBar-Android M新控件
228 0
获取Activity当前屏幕方向。
获取Activity当前屏幕方向。
143 0
|
Android开发
Android Reveal圆形Activity转场动画
一、效果 图片较大无法上传~~ 地址:https://user-gold-cdn.xitu.io/2018/11/2/166d4b91aecdf577?imageslim 二、知识点 CircularReveal动画、透明主题、转场动画(非必须) 三、方案 假设有两个Activity A和B。
2041 0
addroid 自定义布局
        Activity类部分代码: RelativeLayout rl = new RelativeLayout(this); //设置RelativeLayout布局的宽高 RelativeLayout.
696 0
|
Android开发
Android WindowManager悬浮窗:不需要申请权限实现悬浮
 Android WindowManager悬浮窗:不需要申请权限实现悬浮 附录文章1介绍了Android平台上的悬浮窗WindowManager,WindowManager悬浮窗可以悬浮在Android设备上的桌面窗口之上,但是WindowManager的使用,必须先申请权限,在一些定制的Android操作系统中,有可能会将WindowManager悬浮窗的权限一律屏蔽掉,这就导致基于WindowManager的APP功能难以实现。
1912 0