LinearLayout具体解释一:LinearLayout的简单介绍
LinearLayout,中文意思是線性布局。假設你是初學android的,肯定會非常困惑“啥叫布局”,啥又叫“線性布局”呢。
有的時候,我嘗試用官方的語言去解釋,但結果總是讓人非常懊惱。所以我僅僅能跟大家通俗的說“LinearLayout”就是一個View,即視圖,它跟Buttonbutton,Label標簽一樣,有自己的屬性,比方說,高度,寬度,背景色等等。那么跟Buttonbutton,Label標簽有啥差別呢。事實上也非常easy,就是這個LinearLayout他比其它的button之類的控件高端的地方在于,它本身又能夠作為一個視圖容器,用于放置像Button以及Layout之類的控件,而且他的子控件都是以“線性”方式布局的。背景交代完成,大家有疑問記得再問我哦!
然后,我們開始技術一點的,從代碼層次來說。
首先我們看LinearLayout的類繼承圖表
能夠發(fā)現(xiàn),其繼承自ViewGroup,從名字就不難看出,ViewGroup是視圖組的意思。它能夠容納其它控件(記住,視圖也是控件的一種),因此LinearLayout能放置其它子控件的說法也就有了根據(jù)。
然后我們解釋他為什么是個視圖,而且具體的介紹一下。這個非常重要哦,還是那句話,打蛇要打七寸,做事情要做要害,看東西要看本質。LinearLayout的本質,也就是他的最上層的類,事實上是View類(當然那個object就不多說了,再說我打你!)。
既然其父類的本質是view,那我們僅僅須要好好分析一下view就可以:
這個View類說來就話長了,但我們又不得不說,要說呢,就得說的徹底,要讓大家看得一清二楚,明明確白。所以我們就從源碼角度來看一個view是怎樣被載入的吧。
假設大家不知道怎么下載android的源碼,或者說懶得去下載(由于源碼確實比較大,大概有10G)的話,教大家?guī)讉€取巧的辦法:
1.直接在google中輸入“android view.java”就可以。這樣的方法成功率很高,一般android的比較重要的類都能搜到。
2.給大家提供一個人家用于放源代碼的的git:git@gitorious.org:rowboat/frameworks-base.git 大家自己去clone一下。(什么!你Y的竟然連git都不會用!服了,好吧,請繼續(xù)往下看)。
3登錄到這里。這是2里面提供的那個git的網(wǎng)頁地址,在這里搜索對應要查找的類就能夠查找android的源碼了。
從頭說起吧,一般android啟動的是AndroidManifest.xml中帶有
<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>這種activity。然后去調用該activity中的 public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.frame_content);}
方法。當中setContentView是把相應的Layout相應的xml解析成view并顯示在屏幕上的方法,也就是以上代碼中的R.layout.frame_content。
因為activity.java中的代碼量太長,我這邊就貼個鏈接,大家看一下:Activity.java
能夠發(fā)如今1650行的地方有這么一句話:
public void setContentView(int layoutResID) {getWindow().setContentView(layoutResID);}然后我們跳轉到738行 public Window getWindow() {return mWindow;}發(fā)現(xiàn)這個setContentView事實上調用的是mWindow的setContentView,mWindow非常easy理解,就是 member window嘛,以下我們繼續(xù)往window里找。
有關window.java的源碼大家能夠在這里找到。
非常傷心的是,window類是個抽象類
public abstract class Window {,他僅僅是定義了這些方法
public abstract void setContentView(int layoutResID);public abstract void setContentView(View view);public abstract void setContentView(View view, ViewGroup.LayoutParams params);而沒有實現(xiàn)它,那真正實現(xiàn)的地方在哪里呢,請猛戳這里PhoneWindow.java?。可愛的你肯定在疑惑,我砸知道的呢,難道我有“第三僅僅眼”!靠,事實上這個說出來你就會沮喪了,四個字:官方文檔。詳見:
好,以下,我們開始看PhoneWindow.java?的源代碼,直接看函數(shù)setContentView:
@Overridepublic void setContentView(int layoutResID) {if (mContentParent == null) {installDecor();} else {mContentParent.removeAllViews();}mLayoutInflater.inflate(layoutResID, mContentParent);final Callback cb = getCallback();if (cb != null) {cb.onContentChanged();}}能夠發(fā)現(xiàn),事實上它又調用了mLayoutInflater的inflate方法。我,草!!!媽的,搞這么一層又一層干甚。不寫了,且聽下回分解。
轉載于:https://www.cnblogs.com/mfrbuaa/p/3995177.html
總結
以上是生活随笔為你收集整理的LinearLayout具体解释一:LinearLayout的简单介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: EXT 中form的列横向排列
- 下一篇: 黑客与画家 part1 版权声明 par