Android DecorView浅析
摘要 一、DecorView为整个Window界面的最顶层View。 二、DecorView只有一个子元素为LinearLayout。代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域。 三、LinearLayout里有两个FrameLayout子元素。 (20)为标题栏显示界面。只有一个TextView显示应用
(请发邮件到 freeget.one@gmail.com 获得最新翻强软件。)
一、DecorView为整个Window界面的最顶层View。
二、DecorView只有一个子元素为LinearLayout。代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域。
三、LinearLayout里有两个FrameLayout子元素。
(20)为标题栏显示界面。只有一个TextView显示应用的名称。也可以自定义标题栏,载入后的自定义标题栏View将加入FrameLayout中。
(21)为内容栏显示界面。就是setContentView()方法载入的布局界面,加入其中。
工具查看:
1.
下图为SDK中tools文件夹下hierarchyviewer bat 查看ViewTree的结果:
(此时未替换标题栏)
2.替换标题栏后ViewTree的变化:
绿色区域发生了变化,改变为了载入的title.xml文件的布局。
title.xml内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version= "1.0" encoding= "utf-8" ?> <LinearLayout android:layout_width= "fill_parent" android:layout_height= "fill_parent" > <ImageView android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:src= "@drawable/icon2" /> <TextView android:layout_width= "wrap_content" android:layout_height= "wrap_content" android:id= "@+id/title_tv" android:textColor= "#FFFFFF" android:textStyle= "bold" android:text= "@string/app_name" /> </LinearLayout> |
通知栏绘制在1号LinearLayout中,还是绘制在DecorView中还有待探究。
-----------------
ApiDemo中app包下CustomTitle中自定义TitleBar代码段
1 2 3 | requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.custom_title); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_1); |
载入自定义titleBar后如何查找其中元素呢,其实还是findViewById就可以了,因为载入的自定义布局已经在DecorView树中了
而findViewById是怎么回事呢。
activity中findViewById源码
1 2 3 | public View findViewById(int id) { return getWindow().findViewById(id); } |
调用了getWindow().findViewById,getWindow返回的是Window点入查看window中源码
1 2 3 | public View findViewById(int id) { return getDecorView().findViewById(id); } |
所以最终是从DecorView最顶层开始搜索的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2014-09-09 learnyou 相关网站
2011-09-09 形式文法和形式语言
2011-09-09 自动机理论