使用WindowManager添加自定义视图

原文地址:使用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.[email protected] -- 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,谢谢关注破晓博客

时间: 2024-08-24 15:01:22

使用WindowManager添加自定义视图的相关文章

WindowManager(视图主宰者)

WindowManager允许我们在Activity上添加或者是移除view. //这个类主要有三个方法: WindowManager.addView(view,LayoutParams); WindowManager.removeView(view); WindowManager.updateViewLayout(view,LayoutParams); 效果图: 使用方法: //自定义视图 final View view = LayoutInflater.from(this).inflate(

31.怎样添加自定义视图?

自定义视图是在项目开发中经常会面临的工作,通过对视图进行封装,能达到更好的复用性,并使得VC里面的逻辑更加清晰.本篇将对实际项目中常用的图片轮播进行封装. 1.先从源码看起 首先,定义了一个枚举类型,用于区分图片的存储类型:网络图片还是本地图片. /** 图片存储类型 - Local: 本地图片 - Network: 网络图片 */ enum GofImageStoreType: Int { case Local = 0; case Network; } 然后对图片轮播类进行了功能封装. cla

jquery easyui datagrid detailview groupview添加自定义视图view

var myview = $.extend({}, $.fn.datagrid.defaults.view, { onAfterRender: function (target) { $.fn.datagrid.defaults.view.onAfterRender.call(this, target); refreshView(target); }, insertRow: function (target, index, row) { $.fn.datagrid.defaults.view.i

iOS 视图控制器转场详解

前言的前言 唐巧前辈在微信公众号「iOSDevTips」以及其博客上推送了我的文章后,我的 Github 各项指标有了大幅度的增长,多谢唐巧前辈的推荐.有些人问我相关的问题,好吧,目前为止就几个,由于没有评论系统,实在不方便交流,但我也没把博客好好整理,一直都在简书上写博客,大家有问题请移步我的简书本文章的页面.关于交流,我想说这么几点: 1.问问题就好,不要加上大神大牛之类的称呼,与本文有关的问题我尽量回答:不负责解析转场动画,看心情回答. 2.去我的简书下留言是最有效的交流方式,要加我好友就

SpringMVC源码阅读:视图解析器

1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring4.3.7)分析,弄清楚SpringMVC如何完成视图解析的 2.源码分析 在SpringMVC源码阅读:拦截器分析过doDispatch的运行过程,这里再分析一遍 回到DispatcherServlet类的doDispatch方法,看看doDispatch如何获取ModelAndView Hand

android 不能在子线程中更新ui的讨论和分析

问题描述 做过android开发基本都遇见过ViewRootImpl$CalledFromWrongThreadException,上网一查,得到结果基本都是只能在主线程中更改ui,子线程要修改ui只能post到主线程或者使用handler之类.但是仔细看看exception的描述并不是这样的,"Only the original thread that created a view hierarchy can touch its views",只有创建该 view 布局层次的原始线程

[转]Material Design Library 23.1.0的新变化与代码实战

Design Library出来已经快有一个月了,当时大概看了一下介绍这个新版本变化的译文,内容不多,给我印象最深的就是Percent lib.AppBarLayout 和NavigationView的变化,当然还有Design Lib的一些控件内部实现的变化没有介绍,从而使得在使用新版本的控件时候难免因为版本的不同会发生一些异常,而本人正好在上个星期对一个项目换库时发现了这个问题,什么问题呢? NavigationView使用注意的问题 就是NavigationView的内部实现发生了改变,它

iOS自定义转场动画实战讲解

iOS自定义转场动画实战讲解 转场动画这事,说简单也简单,可以通过presentViewController:animated:completion:和dismissViewControllerAnimated:completion:这一组函数以模态视图的方式展现.隐藏视图.如果用到了navigationController,还可以调用pushViewController:animated:和popViewController这一组函数将新的视图控制器压栈.弹栈. 下图中所有转场动画都是自定义的

ASP.NET MVC 多语言实现技巧 最简、最易维护和最快速开发

说说传统做法的缺点 1.做过多语言的都知道这玩意儿太花时间 2.多语言架构一般使用资源文件.XML或者存储数据库来实现.这样就在一定程序上降低了性能 3.页面的可读性变差,需要和资源文件进行来回切换 4.修改麻烦 5.样式兼容难调 6.JS如何处理 另类做法 传统做法看上去高大上实质上唯护起来确实很费力,所以有一部分人就采用了另类做法直接做二套页面.总体来说上面一种和下面一种可以说半斤八两. 上面一种显的有点档次,但维护成本并不低,页面可读性差,样式兼容难调,唯一优点是页面代码逻辑只有一套,只在