LinearLayout详解一:LinearLayout的简介
2014-05-17 09:41
218 查看
LinearLayout,中文意思是线性布局。如果你是初学android的,肯定会很困惑“啥叫布局”,啥又叫“线性布局”呢。
有的时候,我尝试用官方的语言去解释,但结果总是让人很懊恼。所以我只能跟大家通俗的说“LinearLayout”就是一个View,即视图,它跟Button按钮,Label标签一样,有自己的属性,比如说,高度,宽度,背景色等等。那么跟Button按钮,Label标签有啥区别呢。其实也很简单,就是这个LinearLayout他比其他的按钮之类的控件高端的地方在于,它本身又可以作为一个视图容器,用于放置像Button以及Layout之类的控件,并且他的子控件都是以“线性”方式布局的。背景交代完毕,大家有疑问记得再问我哦!
然后,我们开始技术一点的,从代码层次来说。
首先我们看LinearLayout的类继承图表
可以发现,其继承自ViewGroup,从名字就不难看出,ViewGroup是视图组的意思。它可以容纳其他控件(记住,视图也是控件的一种),因此LinearLayout能放置其他子控件的说法也就有了依据。
然后我们解释他为什么是个视图,并且详细的介绍一下。这个很重要哦,还是那句话,打蛇要打七寸,做事情要做要害,看东西要看本质。LinearLayout的本质,也就是他的最上层的类,其实是View类(当然那个object就不多说了,再说我打你!
)。
既然其父类的本质是view,那我们只需要好好分析一下view即可:
这个View类说来就话长了,但我们又不得不说,要说呢,就得说的彻底,要让大家看得一清二楚,明明白白。所以我们就从源代码角度来看一个view是如何被加载的吧。
如果大家不知道怎么下载android的源代码,或者说懒得去下载(因为源代码确实比较大,大概有10G)的话,教大家几个取巧的办法:
1.直接在google中输入“android view.java”即可。这种方法成功率非常高,一般android的比较重要的类都能搜到。
2.给大家提供一个人家用于放源码的的git:git@gitorious.org:rowboat/frameworks-base.git 大家自己去clone一下。(什么!你Y的居然连git都不会用!服了,好吧,请继续往下看)。
3登录到这里。这是2里面提供的那个git的网页地址,在这里搜索相应要查找的类就可以查找android的源代码了。
从头说起吧,一般android启动的是AndroidManifest.xml中带有
这样的activity。然后去调用该activity中的
方法。其中setContentView是把相应的Layout对应的xml解析成view并显示在屏幕上的方法,也就是以上代码中的R.layout.frame_content。
由于activity.java中的代码量太长,我这边就贴个链接,大家看一下:Activity.java
可以发现在1650行的地方有这么一句话:
发现这个setContentView其实调用的是mWindow的setContentView,mWindow很容易理解,就是 member window嘛,下面我们继续往window里找。
有关window.java的源代码大家可以在这里找到。
很伤心的是,window类是个抽象类
,他只是定义了这些方法
而没有实现它,那真正实现的地方在哪里呢,请猛戳这里PhoneWindow.java 。可爱的你肯定在疑惑,我砸知道的呢,难道我有“第三只眼”!
靠,其实这个说出来你就会沮丧了,四个字:官方文档。详见:
好,下面,我们开始看PhoneWindow.java 的源码,直接看函数setContentView:
可以发现,其实它又调用了mLayoutInflater的inflate方法。我,草!!!妈的,搞这么一层又一层干甚。不写了,且听下回分解。
有的时候,我尝试用官方的语言去解释,但结果总是让人很懊恼。所以我只能跟大家通俗的说“LinearLayout”就是一个View,即视图,它跟Button按钮,Label标签一样,有自己的属性,比如说,高度,宽度,背景色等等。那么跟Button按钮,Label标签有啥区别呢。其实也很简单,就是这个LinearLayout他比其他的按钮之类的控件高端的地方在于,它本身又可以作为一个视图容器,用于放置像Button以及Layout之类的控件,并且他的子控件都是以“线性”方式布局的。背景交代完毕,大家有疑问记得再问我哦!
然后,我们开始技术一点的,从代码层次来说。
首先我们看LinearLayout的类继承图表
可以发现,其继承自ViewGroup,从名字就不难看出,ViewGroup是视图组的意思。它可以容纳其他控件(记住,视图也是控件的一种),因此LinearLayout能放置其他子控件的说法也就有了依据。
然后我们解释他为什么是个视图,并且详细的介绍一下。这个很重要哦,还是那句话,打蛇要打七寸,做事情要做要害,看东西要看本质。LinearLayout的本质,也就是他的最上层的类,其实是View类(当然那个object就不多说了,再说我打你!
)。
既然其父类的本质是view,那我们只需要好好分析一下view即可:
这个View类说来就话长了,但我们又不得不说,要说呢,就得说的彻底,要让大家看得一清二楚,明明白白。所以我们就从源代码角度来看一个view是如何被加载的吧。
如果大家不知道怎么下载android的源代码,或者说懒得去下载(因为源代码确实比较大,大概有10G)的话,教大家几个取巧的办法:
1.直接在google中输入“android view.java”即可。这种方法成功率非常高,一般android的比较重要的类都能搜到。
2.给大家提供一个人家用于放源码的的git:git@gitorious.org:rowboat/frameworks-base.git 大家自己去clone一下。(什么!你Y的居然连git都不会用!服了,好吧,请继续往下看)。
3登录到这里。这是2里面提供的那个git的网页地址,在这里搜索相应要查找的类就可以查找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
可以发现在1650行的地方有这么一句话:
public void setContentView(int layoutResID) { getWindow().setContentView(layoutResID); }然后我们跳转到738行
public Window getWindow() { return mWindow; }
发现这个setContentView其实调用的是mWindow的setContentView,mWindow很容易理解,就是 member window嘛,下面我们继续往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);
而没有实现它,那真正实现的地方在哪里呢,请猛戳这里PhoneWindow.java 。可爱的你肯定在疑惑,我砸知道的呢,难道我有“第三只眼”!
靠,其实这个说出来你就会沮丧了,四个字:官方文档。详见:
好,下面,我们开始看PhoneWindow.java 的源码,直接看函数setContentView:
@Override public void setContentView(int layoutResID) { if (mContentParent == null) { installDecor(); } else { mContentParent.removeAllViews(); } mLayoutInflater.inflate(layoutResID, mContentParent); final Callback cb = getCallback(); if (cb != null) { cb.onContentChanged(); } }
可以发现,其实它又调用了mLayoutInflater的inflate方法。我,草!!!妈的,搞这么一层又一层干甚。不写了,且听下回分解。
相关文章推荐
- 《JavaScript凌厉开发 Ext详解与实践》作者简介与媒体推荐
- BSTR详解一 - BSTR简介和内部结构
- Berkeley DB Xml 入门系列之一: 简介与"query"示例程序详解
- jquery 图形报表插件jqplot 简介及参数详解
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
- jquery 图形报表插件jqplot 简介及参数详解
- VMware网络配置详解:三种网络模式简介及实现
- Linux系统简介及安装详解
- jquery 图形报表插件jqplot 简介及参数详解
- BSTR详解一 - BSTR简介和内部结构
- 《JavaScript凌厉开发 Ext详解与实践》作者简介与媒体推荐
- BSTR详解一 -BSTR简介和内部结构
- windows/dos的六种文件系统的简介对比,详解
- 正则表达式使用详解简介
- ASP.NET 2.0程序开发详解 -----------15.1 AJAX简介
- [导入]XML for Analysis(XMLA)开发详解-(1)内容简介及目录
- 《JavaScript凌厉开发 Ext详解与实践》作者简介与媒体推荐
- BSTR详解一 -BSTR简介和内部结构 (1)
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)