zoukankan      html  css  js  c++  java
  • LinearLayout具体解释一:LinearLayout的简单介绍

    LinearLayout,中文意思是线性布局。假设你是初学android的,肯定会非常困惑“啥叫布局”,啥又叫“线性布局”呢。

    有的时候,我尝试用官方的语言去解释,但结果总是让人非常懊恼。所以我仅仅能跟大家通俗的说“LinearLayout”就是一个View,即视图,它跟Buttonbutton,Label标签一样,有自己的属性,比方说,高度,宽度,背景色等等。那么跟Buttonbutton,Label标签有啥差别呢。事实上也非常easy,就是这个LinearLayout他比其它的button之类的控件高端的地方在于,它本身又能够作为一个视图容器,用于放置像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非常easy理解,就是 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方法。我,草!!!妈的,搞这么一层又一层干甚。不写了,且听下回分解。



  • 相关阅读:
    Java3D实例应用载入VRML模型
    Tomcat数据库连接池的配置方法总结
    WebGL学习笔记使用3D引擎threeJS实现星空粒子移动
    mybatis应用实例学习
    springmvc 实例应用
    springmvc定制伪REST风格及JSR303Bean校验整合
    SpringMVC中应用Ajax异步通讯
    Java3D实例应用载入3ds 模型
    Device Mutipath参数设置
    Nginx+FastCGI+Python
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3995177.html
Copyright © 2011-2022 走看看