android view : window
既然是view,为什么要说window,实际上着是一个很有用的东西,在展现view和设计界面上很有用,就比如说悬浮窗
但是这时候又要分清楚一个概念,window到底是什么?在activity中说过了我们的view的父类是一个decorview,decroview是phonewindow的内部类,而phonewindow就是我们所说的window,想这样一个问题,那界面上的那些statusbar和对话框,以及toast又是一些什么?如果抽象思维好,oo思维好,那么一定会明白这些东西其实都一样,都是phonewindow。也就是说所有有边界的东西都是window,也就是phonewindow。包括对话框,toast,悬浮窗,以及statusbar。那么想一下activity的phonewindow是怎么显示出来的?也就是windowmanager。所有的视图的操作加载都是使用的windowmanager。明白了这个概念,就明白了所有添加窗口的机制。
其实在添加窗口的时候,你不可以随便添加,因为窗口是由层级概念的,主要是分为3种,1.系统的窗口:包括statusbar,系统的提示框,来电界面。2.应用窗口:包括activity的窗口等。3应用的子窗口:包括panel,对话框等。也就是说这些窗口类型必须是有顺序的,系统窗口优先级是最高的,你在添加系统的窗口一定会出现在应用窗口的前面,子窗口会出现在应用窗口之前。我们要根据创建窗口的顺序才可以创建出适当位置的窗口。
其实管理这些的是系统的windowmanagerservice。我们可以通过windowmanager来添加一个窗口到界面上。你可能疑问为什么我说窗口有这3种,在windowmanager添加window的时候会有一个type类型,这个类型里面定义了上面的各种type,在2000以上的就是系统窗口的属性值type,但是你要添加一个activity的就必须使用2000一下的,所以dialog和popwindow这些依赖actvity的窗口就需要使用2000以下的属性。
分析源码就可以看出popupwindow使用的是private int mWindowLayoutType = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;而dialog使用的是activity的decroview的WindowManager.LayoutParams l = mWindow.getAttributes();这也就是为什么dialog必须使用activity的context。从这些可以看出来这些东西都是应用的type类型。
悬浮窗:
在设计悬浮窗的时候,有些人使用了连续的toast来展现,其实这个很没有技术含量,完全可以使用挂载window的方式,在挂载window的时候就要注意一些东西了,window需要一个context。这个时候要是actvity关闭了,context的引用就失效了,这显然是不可以的,所以一般是使用service开一个服务来显示悬浮窗,你可以设置window的flag来选择window的一些模式,比如可否点击等,这样就可以自定义view,然后根据这些view的事件来进行处理。
android view : window的更多相关文章
- Android View, Window,Activity概念区分(2)
(1)View:最基本的UI组件,表示屏幕上的一个矩形区域. (2)Window: 表示一个窗口,不一定有屏幕那么大,可以很大也可以很小:它包含一个View tree和窗口的layout 参数.Vie ...
- bug_ _ android.view.WindowManager$BadTokenException: Unable to add window -- token
========4 关于android的一个常见错误:Unable to add window --token is not valid android.view.WindowManage ...
- Android View各种尺寸位置相关的方法探究
Android View各种尺寸位置相关的方法探究 本来想做一个View间的碰撞检测之类的. 动手做了才发现不是想象的那么简单. 首先,写好了碰撞检测的工具类如下: package com.mengd ...
- Android View 之进度条+拖动条+星级评论条....
PS:将来的你会感谢现在奋斗的自己.... 学习内容: 1.进度条 2.拖动条 3.星级评论条 1.进度条... 进图条这东西想必大家是很熟悉的...为了使用户不会觉得应用程序死掉了,因此 ...
- android.view.WindowLeaked解决办法
08-07 14:51:28.129: E/WindowManager(22277): Activity com.xxx.xxx.xxx.xxx.LoginActivity has leaked wi ...
- Android View 的事件分发原理解析
作为一名 Android 开发者,每天接触最多的就是 View 了.Android View 虽然不是四大组件,但其并不比四大组件的地位低.而 View 的核心知识点事件分发机制则是不少刚入门同学的拦 ...
- 关于android.view.WindowLeaked(窗体泄露)的解决方案
虽然是小问题一个,但也困扰了我一段时间,现在记下来,给自己做个备忘,也可以给其他人一个参考 view plaincopy to clipboardprint? 01-08 01:49:27.874: ...
- Activity has leaked window that was originally added -界面退出时未关闭对话框异常 android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? -
退出Activity时弹出登录框,点击确定finish当前Activity,结果报了这个错,随后查找资料知道 原因: 是因为退出Activity时没有关闭弹出框,出现了这个错误 解决方法: 只需要在a ...
- android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
原博客地址:http://aijiawang-126-com.javaeye.com/blog/662336 在Activity中newSpinner是我把mContext传入,但是出了 andr ...
随机推荐
- guava学习--Preconditions
转载:https://my.oschina.net/realfighter/blog/349819 Preconditions是guava提供的用于进行代码校验的工具类,其中提供了许多重要的静态校验方 ...
- STC12C5A60S2 @ 22.0184Mhz 精确延时
#include "STC12.h" // STC12C5A60S2 @ 22.0184Mhz 精确延时 void delay_10us(unsigned char n) { un ...
- 服务器asp.net 3.5 HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效。
配置错误:不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的(overrideModeDefault="Deny"),或者是通过包含 over ...
- 利用jQueryRotate旋转插件开发大转盘抽奖
前言: 公司原来开发大转盘抽奖活动用的是flash 我发现swf文件竟然有6m大,吓尿了! 其实完全可以用js写的,但是自身前端功力有限,且时间紧迫,所以直接用旋转插件就好,兼容各方面都可以保证. 1 ...
- js写的闹钟,支持多个闹钟
因为玩一个游戏,该游戏可以支持多个号,每个号有好多等时间的任务. 来回切换看,太耽误时间.手机的闹钟操作太麻烦. 所以写了一个使用配置文件的闹钟,简单方便. var ForReading = 1, F ...
- thunkify和co的邂逅
上一篇说到thunkify的作用,这一篇说一下thunkify和co的集合 co中有一块代码 /** * Convert a thunk to a promise. * * @param {Funct ...
- BookRent借阅管理
最近整了个BookRent的小应用,单机版.连本地sqlite db.wpf界面,其中涉及到一些有趣的小功能和小坑,简单小结一下. 项目结构是wpf ui->view model->rep ...
- Xcode快捷键
1. 文件 CMD + N: 新文件 CMD + SHIFT + N: 新项目 CMD + O: 打开 CMD + S: 保存 CMD + SHIFT + S: 另存为 CMD + W: 关闭窗口 C ...
- JUnit 4 单元测试
Individual Project ——JUnit 4 单元测试 学习到JUnit单元测试,我拿来测试之前写过的一个计算器(两个依存类:Calc.java CalcFunction.java).代码 ...
- 面试复习(C++)之直接插入排序
#include <iostream> using namespace std; void Insertsort(int *a,int len) { ;j<len;j++) { in ...