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