LinearLayoutCompat源码浅析

来源:互联网 发布:移动网络网页游戏 编辑:程序博客网 时间:2024/06/06 20:23
1、google为了整理之前app开发的碎片化,净化app生态环境,下了很大的力气,比如Mertrial Design的引入,v7包appcompat组件的封装,这里主要拿v7包里的LinaerLayoutCompat的举例;
2、LinearLayoutCompat说白了就是LinearLayout,它是v7包引入的,提高vXXX包的内容,我们第一个会想到的就是向下兼容,没错他就是LinearLayout的兼容版本。
3、LinearLayout在3.0以后引入了子布局分割线的概念,在4.0以后引入了分割线padding的概念,两者有什么区别呢,普通的Linearlayout中使用分割线的用法如下:
   <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="@drawable/ic_launcher"
        android:orientation="vertical"
        android:showDividers="middle" >


        <android.support.v7.widget.AppCompatButton
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />


        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
    </LinearLayout>
v7的android.support.v7.widget.LinearLayoutCompat:
<android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res/com.example.studyday"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff"
    android:orientation="vertical"
    app:divider="@drawable/ic_launcher"
    app:showDividers="middle" >
</android.support.v7.widget.LinearLayoutCompat>
4、细心的你可能已经发现了他们的区别:普通的使用android的命名空间,而v7里面使用的是app自定义的明明空间,同时在上面代码中AppCompatButton和LinaerLayoutCompat一样哦都是v7为了第1条提到的那样能够替代Button才引入的哦。
5、套用我同事的话“好吧,是时候展现真正的技术了哈哈哈”,来看看源码吧。
(1)其实你在XML的设置的属性,都会转变成java对象来处理。因为ADT查看v7包源码比较烦人,我就姑且看了一样LinearLayout原理都是一样的。在LinearLayout构造函数中其实就对showDividers的显示做了初始化,如果你在xml中没有设置该属性那它会为其设置默认不现实的值:SHOW_DIVIDER_NONE,同时也设置了默认的divider样式以及dividerPadding=0不多说了直接上源码吧:


        setDividerDrawable(a.getDrawable(R.styleable.LinearLayout_divider));
        mShowDividers = a.getInt(R.styleable.LinearLayout_showDividers, SHOW_DIVIDER_NONE);
        mDividerPadding = a.getDimensionPixelSize(R.styleable.LinearLayout_dividerPadding, 0);
接下来一一介绍与之相关的三个方法:
public void setDividerDrawable(Drawable divider) :设置了divider的样式,如果用户设置了该值才会为divider设置长宽去显示,并在数据是空时做了一系列优化性能的工作。
public void setDividerPadding(int padding) :设置了divider的Padding的值
public void setShowDividers(@DividerMode int showDividers):设置了具体的显示方式,其中用到了注解数组,也就以为了可以同时设置多种显示方式,数组的值对应着十六进制的0、1、2、4,好吧我也不知道3去哪了。拼接方式估计你也猜到了就是用|运算啦哈哈哈。
注意:用户如果设置了dividerDrawable和ShowDividers都会去调用View的  requestLayout()去重新摆放布局位置。


6、题外话:Android的主要历史更新版本4.0,4.4.5.0等几个主要版本,但是目前开发app一般都兼容到4.0就够了,最多兼容到3.0哦。谈到兼容无非屏幕属性的适配、语言适配、平台版本的适配,在开发中需要兼容的资源都存放在res目录下,例如:values-XXX,XXX对应着上面提到的适配对象,不考虑国际化app,常见的一般都是针对平台的适配,例如values-11 values-14,在这里面可以针对不同的版本的values属性进行设置。
0 0