(轉)Android DecorView淺析

165615139.png

1、DecorView爲整個Window界面的最頂層View。android


2、DecorView只有一個子元素爲LinearLayout。表明整個Window界面,包含通知欄,標題欄,內容顯示欄三塊區域。app


3、LinearLayout裏有兩個FrameLayout子元素。ide


(20)爲標題欄顯示界面。只有一個TextView顯示應用的名稱。也能夠自定義標題欄,載入後的自定義標題欄View將加入FrameLayout中。工具


(21)爲內容欄顯示界面。就是setContentView()方法載入的佈局界面,加入其中。佈局


工具查看:.net


1.xml


下圖爲SDK中tools文件夾下hierarchyviewer bat 查看ViewTree的結果:blog


(此時未替換標題欄)utf-8

165818795.png

2.替換標題欄後ViewTree的變化:get

165909431.png

綠色區域發生了變化,改變爲了載入的title.xml文件的佈局。


title.xml內容爲:


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

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代碼段


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源碼


public View findViewById(int id) {

return getWindow().findViewById(id);

}


調用了getWindow().findViewById,getWindow返回的是Window點入查看window中源碼


public View findViewById(int id) {

return getDecorView().findViewById(id);

}


因此最終是從DecorView最頂層開始搜索的。


-----------------




自定義TitleBar能夠看這篇文章 http://blog.csdn.net/fulianwu/article/details/6834565 很詳細

相關文章
相關標籤/搜索