ViewGroup其本身就是View的扩展---理解
来源:互联网 发布:欧美最美女星知乎 编辑:程序博客网 时间:2024/06/03 13:14
View 和 ViewGroup 是Android UI的基本组件, 而ViewGroup作为容器,可以包含一组View, 并且ViewGroup其本身就是View的扩展。看源码:
public abstract class ViewGroup extends View implements ViewParent, ViewManager
而各种不同的Widgets 像TextView, Button 等等 也是View的扩展,只不过是放在各种Layout里,比如LinearLayout, RelativeLayout。而Layout却是ViewGroup的子类。所以说一个ViewTree(通过eclipse的Outline窗口,我们可以看下这个树状布局。)只不过是各种Views和ViewGroups放在一个Layout里组成的树形结构。
在java中,一个类只能有一个父类,但可以实现多个接口。
扩展的含义:继承+实现接口。
当View有部分被遮挡时,Android就不会再绘制这被遮挡的部分。比如灰色遮挡部分红色,Android绘图机制就不会再绘制那部分红色,所以我们看到的是直接遮挡,而不是颜色的混合。
我们可以借助一个非常有用的工具Heirarchyviewer去更深层细的观察页面布局。
Heirarchyviewer 在文件夹android-sdk/tools下,在命令行下找到这个文件夹,然后执行heirarchyviewer.bat 就可以了。
下图是Hierarchy Viewer的截图:
在Hierarchy Viewer里,列代表树的深度,而每一列里行的数量则表示每一层的深度。从图上我们能注意到RelativeLayout并不是Root级别的,而是id为content的FrameLayout的一个子元素。而实际山我们调用setContentView(View v)里的View v 就是这个content视图。
现在注意下跟content同级的FrameLayout有个子TextView,实际上它既是Activity的titleBar。那么我们删除这个TitleBar之后,View Tree又会变成什么样子呢?
方法:在manifest文件,然后修改application的主题如下:
android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"这样再打开Hierarchy Viewer,我们就能看到下图:
(注意:本人选用的Android是2.2的,要是用4.1的话,并不能得到下图,中间还会多一个Id为action_menu_bar_stub的ViewStub)
这时候我们看到content FrameLayout的父元素是PhoneWindow$DecorView。
DecorView
我们知道在Android中抽象类Window定义了最上层窗口的基本外观以及基本行为,她的实例将会被加到WindowManager中,提供一些标准的UI策略,像Background,Titlebar,以及Default key processing等等,当然这些属性是可以通过WindowManager.LayoutParams定制的。
而上面提到的PhoneWindow是Window抽象类的唯一实现,即android.policy.PhoneWindow。而DecorWindow是PhoneWindow的一个私有内部类,其实就是一个FrameLayout的扩展。
private final class DecorView extends FrameLayout implements RootViewSurfaceTaker {}就是这个类构成了最上层应用程序视图。根据我们在Manifest中设置的Theme或者在PhoneWindow设置的Flags,来确定DecorView的Layout。所以在我们的例子中,第一张中我们有个简单的主题(在Manifest中)包含一个titlebar和contentview,于是PhoneWindow就生成了包含Title的LinearLayout,以及放置content的FrameLayout。而在第二张图中,我们去掉了titlebar主题,所以她就只生成了包含FrameLayout的DecorView了。
结论
最后我们来总结下,当一个Activity被启动的时候,这个视图树(View Tree)大体是如何创建的呢:
1. PhoneWindow根据Manifest的主题或者是特定的PhoneWindow设置去生成一个DevorView的布局,作为跟视图(Root View)。
2. Activity调用setContentView()方法把用户自定义的Layout XML文件作为内容视图(Content View), 当然其内部是调用PhoneWindow的setContentView()方法。
3. 经过上两步,UI视图就已经形成了,那么当UI每次被刷新的时候,View Tree就会像上面所说的那样被Traverse。
- ViewGroup其本身就是View的扩展---理解
- View和ViewGroup的理解
- 程序的打印其本身
- 自定义ViewGroup和其子View
- Android view获取其本身在屏幕中的位置和尺寸的方法
- 用户界面中对View 和ViewGroup对象的理解
- 自定义ViewGroup来理解View的scrollTo()方法
- View的inflate(int resource, ViewGroup root)理解
- 对Android view/viewgroup事件分发的理解
- ViewGroup和View的理解和当子视图发生更新时通知viewgroup更新
- View/ViewGroup的"生命周期"
- ViewGroup的dispatchTouchEvent理解
- View和ViewGroup事件分发理解
- View 和 ViewGroup的分析
- view和viewgroup的详解
- View 和 ViewGroup 的 hasFocusable
- view 与viewGroup的关系
- View和ViewGroup的TouchEvent
- 二分查找
- git命令
- 提高iOS开发效率的方法和工具
- C/C++ 开源 JSON 程序库性能及标准符合程度评测
- tomcat部署之字符编码问题
- ViewGroup其本身就是View的扩展---理解
- PL/SQL 编写查询语句时LIKE中文不起作用
- Matlab 符号运算的因式分解、展开与合并、简化
- JS 错误处理与调试
- 二分查找数组交集初级版
- 七,可视化的客户端管理工具MongoVUE
- Ubuntu14.04 搭建FTP
- 避免防泄密误区 合理采取数据安全措施
- Recovery 简介