摘要 一、DecorView爲整個Window界面的最頂層View。 二、DecorView只有一個子元素爲LinearLayout。代表整個Window界面,包含通知欄,標題欄,內容顯示欄三塊區域。 三、LinearLayout裏有兩個FrameLayout子元素。 (20)爲標題欄顯示界面。只有一個TextView顯示應用
(請發郵件到 [email protected] 獲得最新翻強軟件。)
一、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最頂層開始搜索的