探索Android 在我們的布局上新增了什麼

2021-06-26 15:55:34 字數 1775 閱讀 9396

在activity的oncreate裡我們設定內容的時候需要呼叫setcontentview,那麼setcontentview幹了什麼呢?

public void setcontentview(int layoutresid)
從方法裡看出來 1.設定內容  2.初始化actionbar

在initactionbar();裡:

private void initactionbar() 

mactionbar = new actionbarimpl(this);

mactionbar.setdefaultdisplayhomeasupenabled(menabledefaultactionbarup);

mwindow.setdefaulticon(mactivityinfo.geticonresource());

mwindow.setdefaultlogo(mactivityinfo.getlogoresource());

}

我們可以看到 為什麼如果我們要呼叫requestfeature,就必須要在setcontent之前了。

以上題外話,我們知道執行完setcontentview之後,android系統會給我們新增一層id為 content的framelayout,於是我就想知道,螢幕上除了顯示的view還有什麼呢?我打算一**竟:

我知道的探索的方法有兩種:

1.利用sdk/tools/hierarchyviewer.bat  檢視  比較簡單 不過要求是手機已經root。

2.**方式,這個比較簡單 但是看到的東西沒有用hierarchyviewer看得多。

1.首先 setcontentview(r.layout.activity_main); 這個view裡有乙個rl  (不知道放不同的view會不會有影響)

找到這個view  relativelayout rl = (relativelayout) findviewbyid(r.id.rl);
然後通過這個view的 getparent來獲得他的父view

viewparent vp = rl.getparent();
通過除錯 發現它是乙個 framelayout

同理繼續:

viewparent vvp = vp.getparent();
發現這個vvp是乙個叫actionbaroverlaylayout的乙個viewgroup,

不僅如此,它除了framelayout之外還有兩個子view,乙個linearlayout,乙個actionbarcontainer

這個actionbarcontainer extends nineframe 而nineframe extends framelayout  說來actionbarcontainer算是個framelayout;

我覺得這個linearlayout是用來放頂部的actionbar的。

再繼續會發現,再上面是乙個 phonewindow$decorview,而這裡也到頂了,再上去獲得的是null了。

至於為什麼叫phonewindow$decorview,我只知道decorview是被windowmanager新增在window裡的。

phonewindow是乙個android的基本視窗系統,每個activity都會有乙個,是activity與view交接的介面。

decorview據說是個framelayout...

截乙個hierarchyviewer看的圖:

探索與發現,我們在路上

從50年代到接近90年代末,這一時期都是廠家的年代,以廠家為主導。什麼意思呢?就拿泡沫時期來說,sun的伺服器供不應求,要買伺服器幾乎是不計成本的,只要拿得到裝置已經是很不錯了。在那個時代,廠家擁有絕對地主動權,由於需求大過 廠商可以決定把貨物優先提供給他們比較重視的客戶。在這種時候下,客戶顯然有求...

探索與發現,我們在路上

從50年代到接近90年代末,這一時期都是廠家的年代,以廠家為主導。什麼意思呢?就拿泡沫時期來說,sun的伺服器供不應求,要買伺服器幾乎是不計成本的,只要拿得到裝置已經是很不錯了。在那個時代,廠家擁有絕對地主動權,由於需求大過 廠商可以決定把貨物優先提供給他們比較重視的客戶。在這種時候下,客戶顯然有求...

flex布局的探索

flex布局方案已經是前端技術棧家家互曉的網頁布局方案,它為盒狀模型提供最大的靈活性,意為 彈性布局 有幸讀了阮一峰老師的 flex布局教程 語法篇,flex布局教程 例項篇 並加以研究,受益良多,為我平時網頁布局提供了極大的便利性。flex是一維的東西,所以說它只能控制乙個方向,用座標系來表示就是...