zoukankan      html  css  js  c++  java
  • Android攻城狮布局优化

    Android常用的布局样式
    1.LinearLayout(线性布局) 线性的 垂直的 水平的
    2.RelativeLayout(相对布局) 最灵活的
    3.TableLayout(表格布局) 现在被 GridView代替
    4.AbsoluteLayout(绝对布局) 已淘汰
    5.FrameLayout(帧布局) 布局叠加时使用
    
    现在基本使用线性布局和相对布局,特殊情况会使用帧布局(视频暂停、缓冲文件等)。

    Android布局原则
    1.尽量多使用LinearLayout(线性布局)和RelativeLayout(相对布局),不要使用AbsoluteLayout(绝对布局)
    2.在布局层次相同的情况下,建议使用LinearLayout代替RelativeLayout,因为这时LinearLayout的性能比RelativeLayout要好一些。
    3.将可复用的组件抽取出来并通过include标签使用
    4.使用ViewStub标签来加载一些不常用的布局
    5.使用merge标签减少布局的嵌套层次。
    灵活使用后面三条原则,将极大优化项目的布局。
    ----------------------------------
    < include />的使用
    作用:将公用的组件抽取出来单独放到一个xml文件中,然后使用include标签导入公用布局。
    效果:提高UI的制作和复用效率,也能保证制作的UI布局更加规整、可维护。




    本节编程步骤:
    1. 创建相对布局 common_title.xml。同时修改 AndroidManifest.xml的application的主题样式属性,改做:android:theme="@android:style/Theme.Light.NoTitleBar"
    2. 在 common_title.xml 中添加3个 TextView,TextViwe的属性分别设置为左对齐(layout_alignParentStart="true")、居中(layout_centerInParent="true")和右对齐(layout_alignParentEnd="true")。同时都设置为垂直居中(layout_centerVertical="true"),另外修改RelativeLayout的属性layout_height="wrap_content",这样就做好标题栏了。
    3.在main.xml中添加<include>标签,把common_title.xml引入到这里:
    <include
        layout="@layout/common_title"
    />
    使用include,就相当于把common_title加入到main.xml,成为main.xml的一部分。所以可以在 MainActivity 中直接使用findViewById(R.id.XXX)找到common_title里面的控件。

    使用merge合并UI布局
    作用:合并UI布局,使用该标签能降低UI布局的嵌套层次。
    场景(1):布局根结点是FrameLayout且不需要设置background或者padding等属性,可以用merge代替;
    场景(2):某布局作为子布局被其他布局include时,使用merge当作该布局的顶结点,这样在被引入时顶结点会自动被忽略。
    关于第二点,比如说我们新建一个 common_progressbar.xml 文件,根布局是LinearLayout,里面设置ProgressBar和TextView.。本来LinearLayout采用的是垂直布局,ProgressBar和TextView不会叠加,但在 main.xml 文件中添加 FrameLayout子布局,并在里面使用 include 添加 common_progressbar.xml,并且修改common_progressbar.xml的根布局,用merge代替LinearLayout,结果就出现 ProgressBar和TextView 叠加的效果,说明被include进来的根布局被自动忽略了。
    其实也同样证明了第一点。正因为是在FrameLayout里面使用了include,才能顺利地用merge代替LinearLayout。
    使用ViewStub惰性加载
    作用:ViewStub标签同include标签一样可以用来引入一个外部布局,不同的是,ViewStub引入的布局默认不会扩张,既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。
    所以,可以人为地控制什么时候去加载ViewStub的内容。
    ViewStub通常作为一种优化,只有触发某种事件的时候才会显示内容,才会去占用cpu和内存。
    ----------------------
    这里我们通过使用按钮来实现ViewStub惰性加载。
    1. 首先新建一个 common_text文件,只添加TextView控件。
    2. 在 main.xml 文件中添加 Button 和 ViewStub,其中ViewStub添加属性android:layout="@layout/common_text",完成布局的添加。
    3. 在 MainActiivity中创建和初始化Button和ViewStub。对Button添加监听器,监听点击事件。重写onclick()方法:在里面添加一句:viewStub.inflate();//令惰性加载ViewStub加载布局
    -----------------
    不使用ViewStub也可以隐藏内容:比如说,TextView就有visibility属性,设置visibility="gone"就不会显示内容。可以设置个按钮监听器,当点击此按钮后,就修改visibility="visible"就能显示内容。
    ----------------------
    摘自评论区:
    viewstub显示出来最好不要用inflate();最好用setVisibility(viewstub.VISIBLE)显示和用setVisibility(viewstub.GONE)隐藏,会少些麻烦。但是也有缺点,就是占用内存。
    
    
    另外,那个“显示隐藏内容按钮”,点一次,出现“隐藏内容”,再点第二次,程序直接闪退。原因:对ViewStub的inflate操作只能进行一次,因为inflate的时候是将其指向的布局文件解析inflate并替换掉当前ViewStub本身(由此体现出了ViewStub“占位符”性质),一旦替换后,此时原来的布局文件中就没有ViewStub控件了,因此,如果多次对ViewStub进行infalte,会出现错误信息:ViewStub must have a non-null ViewGroup viewParent。












  • 相关阅读:
    Another option to bootup evidence files
    切莫低估了使用者捍卫个人隐私的强烈意志
    如何验证证书绑定?
    How to verify Certificate Pinning?
    iDevice取证的一大突破
    Do you know how many stuff inside your Google Account?
    Use LiveCD to acquire images from a VM
    完成评论功能
    从首页问答标题到问答详情页
    首页列表显示全部问答,完成问答详情页布局。
  • 原文地址:https://www.cnblogs.com/my334420/p/6718751.html
Copyright © 2011-2022 走看看