android让一个控件跟上面控件对其,学个明白--Android控件架构
Android控件架構
1.什么是View?
View是Android中所有控件的基類。View是界面層的控件的一種抽象,它代表了一個控件。在Android中每個控件都會在界面中占得一塊矩形的區域。在Android中控件被分為兩類:View和ViewGroup。ViewGroup控件作為父控件可以包含多個View控件,并管理它包含的View控件。通過ViewGroup,整個界面上的控件形成了一個樹形結構,這幾件事我們常說的控件樹,上層控件負責下層子控件的測量和繪制,并傳遞交互事件。
2.所謂的樹結構
ViewGroup,顧名思義,它是控件組。但是,在Android的設計中,ViewGroup也是繼承自View的,這也就意味著View本身就是可以是單個控件也可以是由多個控件組成的一組控件。通過這種關系就形成了View樹的結構。-- Android開發藝術探索
3.findViewById()是如何找到元素的?
我們使用findViewById()方法,就是在控件樹種以樹的深度優先遍歷來查找對應元素。在每個控件樹的頂部都有一個ViewParent對象,它就是整棵樹的控制核心,所有的交互管理事件都由它來統一調度和分配,從而可以對整個視圖進行整體控制。
4.View樹結構,和UI界面架構圖
圖來自《Android群英傳》
View樹結構&UI界面架構圖.png
5.剖析UI界面架構圖
正如圖3.2所示,每個Activity都包含一個Window對象,在Android中Window對象通過由PhoneWindow 來實現。
PhoneWindow將一個DecorView設置為整個應用窗口的根View。
DecorView作為窗口界面的頂層視圖,封裝了一些窗口操作的通用方法。可以說,DecorView將要顯示的具體內容呈現在了PhoneWindow上,這里面所有的View 監聽事件,都通過WindowManagerService 來接收,并通過Activity對象來回調相應的onClickListener。
在顯示上,一般情況下DecorView內部會包含一個垂直方向的LinearLayout,將屏幕分成兩個部分,一個是TitleView,一個是ContentView,現在知道為啥子我們設置布局的時候是setContentView(R.layout.activity_main) 了吧。 這個我們非常親密的布局——ContentView,它是一個ID為android.R.id.content的FrameLayout,我們的布局文件layout.activity_main就是設置在這樣一個FrameLayout里面的。
知道了上面的這些之后,介紹一下標準視圖樹。
6.almost標準視圖樹
為什么是almost標準視圖樹,因為Android版本對AndroidUI會變動啊,可能某個時候這就不適用了。
almost標準視圖樹.png
上面的就是最常用的布局,上面TitleBar/ActionBar(這里先不說ToolBar的事),下面Content,(在TitleBar的情況下)如果用戶使用requestWindowFeature(Window.FEATURE_NO_TITLE)設置全屏,那么就只剩下Content了。并且requestWindowFeature(Window.FEATURE_NO_TITLE)要早setContentView之前調用,為啥?因為Content要占用TitleBar的位置。
而在代碼中,當程序在onCreate()中調用setContentView()方法后,ActivityManagerService會回調onResume()方法,此時系統才會把整個DecorView添加到PhoneWindow中,并讓內容顯示出來,從而完成界面的繪制。
8.補充知識:TitleBar和ActionBar的區別
因為之前的內容說道了TitleBar,TitleBar是個老舊的東西,所以這兩年才學Android的朋友可能沒聽到這玩意。下面補充一下TitleBar的常用的問題。
主要是說說隱藏actionBar和titileBar的問題
隱藏ActionBar和TitleBar方式很多,想了解的看這位網友寫的blog
先來看個例子:
public class MainActivity extends AppCompatActivity {
Button mBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
}
}
運行之后發現,上面的"TitleBar"沒有消失,是不是很生氣,是不是想罵我騙子。客官不可以,您息怒。聽我娓娓道來。
我們來看看ActionBar來自何方。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().hide();
// requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
}
// 我們command+點擊 getSupportActionBar(),發現這個方法是AppCompatActivity類中的。
// 同樣的方式你會發現requestWindowFeature()是Activity類的。
// 所以,現在你是不是該明白點什么。
下面說TitleBar與ActionBar的區別:
i. 兩者activity繼承的類不一樣,actionbar繼承AppCompatActivity, titlebar繼承Activity,如果搞混了繼承的類的話,會導致上述隱藏相應控件失效。
ii. TitleBar,也就是標題欄,它緊挨在狀態欄的下面,正常情況下它的布局和主題樣式都是使用系統定義好的,且默認情況下只顯示圖標和文本。
iii. ActionBar,也就是操作欄,它是Android3.0以后引入SDK的,通過它去取代之前標題欄,它和標題欄一樣緊挨狀態欄的下面,它可以放入按鈕,或下拉式的按鈕.可以有文字,logo等信息.還可以設置返回按鈕等信息。
參考資料:
developer.android.com
Android群英傳
Android開發藝術探索
下一篇文章準備寫Android世界的坐標系
總結
以上是生活随笔為你收集整理的android让一个控件跟上面控件对其,学个明白--Android控件架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《楚乔传》仲羽是什么人 仲羽真实身份遭扒
- 下一篇: html5表白页面3d,七夕节表白3d相