Android应用开发之Android开发中布局优化方法
白羽 2018-10-31 来源 :网络 阅读 908 评论 0

摘要:本文将带你了解Android应用开发之Android开发中布局优化方法,希望本文对大家学Android有所帮助。

本文将带你了解Android应用开发之Android开发中布局优化方法,希望本文对大家学Android有所帮助。

Android开发中布局优化方法
《Android开发艺术探索》 Android性能优化
对于Android性能优化这方面,也许很多同学都有同感,觉得自己只是在写一个demo或者是一个不需要上架的App,只要测试的时候能够完成基本需求,那么就算完工了。
但是,如果想开发出更优秀的Android应用,那么了解Android的性能优化就十分有必要了。
本文主要涉及到Android布局优化方面的知识,以及使用DDMS查看Activity的布局结构。
布局优化
要进行布局优化,思路很简单,就是让布局文件的层级减少。那么最基本的方法就是删除布局中无用的控件和布局。其次有选择地使用ViewGroup,如果布局中既可以用LinearLayout也可以用RelativeLayout,那么尽量采用LinearLayout,因为RelativeLayout是一种性能相对较低的布局,它的功能比较复杂,在进行布局过程时需要花费更多的CPU时间。而FrameLayout和LinearLayout都是简单高效的ViewGroup,在只考虑单层布局的时候,并且能达到需求的情况下,尽量优先选择它们。
但是如果需要进行嵌套的形式才能达到效果的话,还是建议使用RelativeLayout,因为ViewGroup的嵌套相当于增加了布局的层级,同样会降低程序性能。
了解了基本的方法后,接下来看看Android机制为我们提供的一种方法,使用和ViewStub。
标签
该方法可以让我们重用一些布局,当我们的布局中添加标签,我们可以将一个指定布局添加到当前布局当中,来达到布局的重用,避免在多个不同的布局中重写重复的公共代码。
代码展示:
       
上面代码中,include>就指定了另一个布局文件second_layout,通过这个方法可以直接将second_layout布局添加进来。
需要注意的是,如果second_layout的布局宽高都是match_parent那岂不是会将当前布局的所有内容遮挡住了吗?
为了解决这个问题,我们可以在include标签中添加相关的属性,这里的属性仅仅包括android:layout_开头的属性以及id属性,其他类型的属性都是不支持的,如android:background。这里,只有在使用了android:layout_height和android:layout_width情况下,才能指定其他的android:layout_*属性,否则其他的android:layout_*都会无效,下面看看实例代码。

标签
这个标签一般配合使用,目的是可以减少无用的布局。这里我们直接引用例子看看这个标签的作用:
activity_main.xml
        
second_layout.xml
       
接着我们在Android Device Monitor 的DDMS 使用dump View Hierarchy for UI automator 对布局进行分析
android studio3.0:可以查看AndroidStudio3.0打开Android Device Monitor打开Android Device Monitor,
android studio2.0:工具栏的的Tools->Android->device monitor。

从图中可以看到 当前的布局将second_layout.xml布局中的内容都添加进来了,可是却存在着两个LinearLayout的嵌套关系,从布局文件中我们可以发现,second_layout布局中的LinearLayout是多余的,那么就需要使用标签来解决这个无用的嵌套关系,代码如下:
       
接着我们继续使用DDMS对布局进行分析

发现second_layout布局中的LinearLayout消失了,所以使用标签能为我们去掉多余的一层LinearLayout。
ViewStub
ViewStub的意义是可以按需加载所需要的布局文件。即我们可以在需要某个布局出现时才令它出现,这时候你可能会想到,我们可以将某个还未需要的元素使用invisible或者gone进行隐藏,但其实该元素依然存在于布局当中,在解析布局时也是需要进行解析的。
而ViewStub继承了View,它非常轻量级且宽/高都为0,因此它本身不参与任何的布局和绘制过程。ViewStub的意义是可以按需加载所需要的布局文件。
在需要加载ViewStub布局时有两种方法:
((ViewStub)findViewById(R.id.stub_import).setVisibility(View.VISIBLE);
?1View importPanel =(ViewStub)findViewById(R.id.stub_import).inflate();
代码
主布局:
?1234    
ViewStub引用的布局:
                
Activity:
public class MainActivity extends AppCompatActivity {     private Button cancel_btn;    private Button add_btn;    private ViewStub viewStub;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);         add_btn=(Button)findViewById(R.id.add_btn);        cancel_btn=(Button)findViewById(R.id.cancel_btn);         viewStub = (ViewStub)findViewById(R.id.view_stub);         add_btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {              viewStub.setVisibility(View.VISIBLE);            }        });        cancel_btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                 viewStub.setVisibility(View.INVISIBLE);             }        });      }}


这里只是一个简单的演示,实际当中使用时,我们可以是加载复杂的布局进来,那么ViewStub就会显得十分的有用。
最后针对该标签需要注意的是:
1.当ViewStub通过setVisibility或者infalate方法加载后,ViewStub就会被它的内部布局替换掉,这时候ViewStub就不是整个布局结构中的一部分了。
2.目前ViewStub还不支持标签,所以可能会导致布局中存在多余的嵌套结构,这个要根据项目的实际开发来进行取舍,对于有必要隐藏的复杂的布局文件,即使增加了多余的布局结构,使用ViewStub仍然会利大于弊。    


本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程