Android最好功用实习(四)——规划优化窍门-Android-优质IT资源分享社区

admin
管理员
管理员
  • UID1
  • 粉丝29
  • 关注4
  • 发帖数581
  • 社区居民
  • 忠实会员
  • 原创写手
阅读:210回复:0

  Android最好功用实习(四)——规划优化窍门

楼主#
更多 发布于:2016-05-30 22:00


在前面几篇文章傍边,咱们学习了怎么通过合理办理内存,以及高功用编码窍门的办法来进步应用程序的功用。然而实际上界面规划也会对应用程序的功用发生对比大的影响,假如规划写得差劲的话,那么程序加载UI的速度就会十分慢,从而形成欠好的用户体验。那么本篇文章咱们就来学习一下,怎么通过优化规划来供给应用程序的功用。还没有看过前面前面一篇文章的兄弟主张能够先去阅览 Android最好功用实习(三)——高功用编码优化
重用规划文件
Android体系中现已供给了十分多好用的控件,这让咱们在编写规划的时分能够很轻松。可是有些时分咱们也许需求重复运用某个现已写好的规划,假如你老是运用复制粘贴的办法来进行规划重用,这显然是一种很笨的做法。而Android当然也现已充分考虑到了规划重用的重要性,所以供给了和这两个十分有用的标签,下面咱们就来逐个学习一下。

标签能够答应在一个规划傍边引进别的一个规划,那么比如说咱们程序的一切界面都有一个公共的有些,这个时分最好的做法即是将这个公共的有些提取到一个独立的规划文件傍边,然后在每个界面的规划文件傍边来引证这个公共的规划。
这儿举个比如吧,咱们应当都知道,如今简直一切的软件都会有一个头规划,头规划中能够包括界面的标题、回来按钮、以及其它一些操作功用等。那这么的一个头规划,有些软件是运用ActionBar来完结的,可是由于ActionBar的灵活性不太好,因而也有许多软件会挑选自个去编写完结。那假如自个去完结的话,由于这个头规划是在一切界面都要运用的,显然咱们不也许在每个界面傍边都去写一遍这个头规划的代码,因而这种状况下运用标签就十分适宜了。这儿为了给咱们演示一下,我就编写一个十分简略的头规划,在res/layout文件夹中新建titlebar.xml作为头规划,代码如下所示:

能够看到,titlebar.xml中的规划十分简略,外层是一个RelativeLayout,里边只要两个Button和一个TextView,左面的Button用于完结回来功用,右边的Button用于完结完结功用,中心的TextView则能够用于显现当时界面的标题。咱们能够来预览一下titlebar的样子,如下图所示:

好的,那titlebar作为一个独立的规划如今咱们现已编写完了,接下来的作业就十分简略了,不管任何界面需求参加titlebar这个功用,只需求在规划文件中引进titlebar.xml就能够了。那么比如说咱们的程序傍边有一个activity_main.xml文件,如今想要引进titlebar只需求这么写:
......
十分简略吧,一行include句子就能够搞定了。标签傍边能够指定一个layout特点,咱们在这个layout特点中填写需求引进的规划名就能够了。并且运用这种引进的办法,今后假如titlebar的界面有所变更,咱们只需求修正titlebar.xml这一个文件就能够了,而不是一切界面一个个地去修正。
等等!如今假如你运转一下程序会发现出大疑问了,尽管titlebar是成功引进了,可是咱们activity_main.xml中正本的界面全部都不见了!出现这个疑问是因素是由于titlebar的最外层规划是一个宽高都是match_parent的RelativeLayout,它会将全部规划都填充溢,因而咱们本来的规划也就看不见了。那已然疑问的因素明白了,信任你马上就想到应当怎么修正了,将RelativeLayout的layout_height特点修正成wrap_content不就能够了嘛。没错,这么修正当然是没疑问的,不过这种修正办法会让一切引证titlebar的界面都受到影响,而怎么你只期望让activity_main.xml这一个界面受影响的话,那么能够运用覆写特点的办法。
在标签傍边,咱们是能够覆写一切layout特点的,即include中指定的layout特点将会覆盖掉titlebar中指定的layout特点。因而,这儿咱们期望将titlebar的高度设置成wrap_content,就能够这么写:
......
如今从头运转一下程序应当就能够一切正常了,如下图所示:

除了layout_height以外,咱们还能够覆写titlebar中的任何一个layout特点,如layout_gravity、layout_margin等,而非layout特点则无法在标签傍边进行覆写。别的需求留意的是,假如咱们想要在标签傍边覆写layout特点,有必要要将layout_width和layout_height这两个特点也进行覆写,不然覆写作用将不会收效。

标签是作为标签的一种辅佐拓展来运用的,它的首要作用是为了避免在引证规划文件时发生剩余的规划嵌套。咱们都知道,Android去解析和展现一个规划是需求耗费时刻的,规划嵌套的越多,那么解析起来就越耗时,功用也就越差,因而咱们在编写规划文件时应当让嵌套的层数越少越好。
在上面咱们讲解标签的用法时首要介绍了它长处,可是它也存在着一个欠好的当地,即是也许会致使发生剩余的规划嵌套。这儿仍是通过举例的办法跟咱们说明一下,比如说咱们需求编写一个断定撤销按钮的公共规划,这么任何一个界面需求断定和撤销功用时就不必再独自编写了,新建ok_cancel_layout.xml,代码如下所示:

能够看到,这个界面也是十分简略,外层是一个笔直方向的LinearLayout,LinearLayout中包括了两个按钮,一个用于完结断定功用,一个用于完结撤销功用。如今咱们能够来预览一下这个界面,如下图所示:

好的,然后咱们有一个profile.xml的界面需求修正一些内容,那么这儿就能够将ok_cancel_layout这个规划引进到profile.xml界面傍边,如下所示:

在profile.xml傍边有一个EditText控件用于修正内容,然后下面运用了标签来将ok_cancel_layout规划进行引进,如今从头运转一下程序,界面作用如下图所示:

看上去作用十分不错对吗?可是在你毫无发觉的状况下,如今profile.xml这个界面傍边其完结已存在着剩余的规划嵌套了!感受还没写几行代码呢,怎么这就现已有剩余的规划嵌套了?不信的话咱们能够通过View
Hierarchy东西来检查一下,如下图所示:

能够看到,最外层首要是一个FrameLayout,这个无可厚非,不知道为何最外层是FrameLayout的兄弟能够去参阅 Android LayoutInflater原理分析,带你一步步深化了解View(一) 这篇文章。然后FrameLayout中包括的是一个LinearLayout,这个即是咱们在profile.xml中界说的最外层规划。接下来的有些就有疑问了,在最外层的LinearLayout傍边包括了两个元素,一个是EditText,另一个又是一个LinearLayout,然后在这个内部的LinearLayout傍边才包括了断定和撤销这两个按钮。
信任咱们现已能够看出来了吧,这个内部的LinearLayout即是一个剩余的规划嵌套,实际上并不需求这么一层,让两个按钮直接包括在外部的LinearLayout傍边就能够了。而这个剩余的规划嵌套本来即是由于规划引进所致使的,由于咱们在ok_cancel_layout.xml中也界说了一个LinearLayout。那么应当怎么优化掉这个疑问呢?当然即是运用标签来完结了,修正ok_cancel_layout.xml中的代码,如下所示:

能够看到,这儿咱们将ok_cancel_layout最外层的LinearLayout规划删除去,换用了标签,这就表示当有任何一个当地去include这个规划时,会将标签内包括的内容直接填充到include的方位,不会再增加任何额定的规划构造。好的,的用法即是这么简略,如今从头运转一下程序,你会看到界面没有任何改动,然后咱们再通过View
Hierarchy东西来检查一下当时的View构造,如下图所示:

OK,能够看到,如今EditText和两个按钮都直接包括在了LinearLayout下面,咱们的profile.xml傍边也就不存在剩余的规划嵌套了。
仅在需求时才加载规划
有的时分咱们会遇到这么的场景,即是某个规划傍边的元素十分多,但并不是一切元素都一同显现出来的,而是通常状况下只显现有些常用的元素,而那些不常用的元素只要在用户进行特定操作的状况下才会显现出来。
这儿举个咱们都十分了解的比如,咱们在增加联系人的时分本来能够修正的字段真的十分多,名字、电话、email、传真、住址、昵称等等等等,但本来根本上咱们最常用的即是填一个名字,填一个电话罢了。那么将这么多冗杂的字段都一同显如今界面上本来并不是一种很好的做法,由于大多数人都是用不到这些字段的。对比聪明的做法即是把最常用的名字和电话显如今界面上,然后给用户供给一个增加更多字段的选项,当用户真的有需求去增加其它信息的时分,咱们才将别的的元素显现到界面上。
说到完结这么一个功用,我信任大多数人的榜首反响即是将不常用的元素运用INVISIBLE或许GONE进行躲藏,然后当用户需求运用这些元素的时分再把它们置成VISIBLE显现出来。运用这种办法必定能够完结功用的,可是功用方面就体现得通常了,由于即便是将元素进行躲藏,它们本来仍是在规划傍边的,每个元素还拥有着自个的宽、高、布景等等特点,解析规划的时分也会将这些躲藏的元素逐个解析出来。
那么咱们怎么才能让这些不常用的元素仅在需求时才去加载呢?Android为此供给了一种十分轻量级的控件,ViewStub。ViewStub尽管也是View的一种,可是它没有巨细,没有绘制功用,也不参加规划,资本耗费十分低,将它放置在规划傍边根本能够认为是彻底不会影响功用的。
下面咱们就来学习一下怎么运用ViewStub来完结仅在需求时才去加载规划的功用,如今profile.xml中只要一个EditText用于修正信息,那么比如说咱们还有别的三个不太常用的EditText,就能够将它们界说在别的一个规划文件傍边。新建profile_extra.xml文件,代码如下所示:

能够看到,在profile_extra.xml这个规划文件傍边界说了三个EditText,也即是用于修正那些不常用信息的控件,如今咱们能够来预览一下这个规划,如下图所示:

如今profile_extra.xml是一个独立的规划,和profile.xml这个规划文件是彻底没有关系的。接下来咱们修正profile.xml文件中的代码,如下所示:

能够看到,这儿咱们新增了一个More
Button,这个按钮即是用于去加载那些不常用的元素的,然后在Button的下面界说了一个ViewStub。在ViewStub控件中,咱们先是通过id特点给它指定了一个仅有标识,又通过layout特点将profile_extra规划传入进来,接着给ViewStub指定了一个宽高。留意,尽管ViewStub是不占用任何空间的,可是每个规划都有必要要指定layout_width和layout_height特点,不然运转就会报错。
接着修正ProfileActivity中的代码,在Activity中增加More
Button的点击事情,并在点击事情中进行如下逻辑处理:
private EditText editExtra1;private EditText
editExtra2;private EditText editExtra3;public void onMoreClick() {     ViewStub
viewStub = (ViewStub) findViewById(R.id.view_stub);     if (viewStub != null) {
          View inflatedView = viewStub.inflate();           editExtra1 =
(EditText) inflatedView.findViewById(R.id.edit_extra1);           editExtra2 =
(EditText) inflatedView.findViewById(R.id.edit_extra2);           editExtra3 =
(EditText) inflatedView.findViewById(R.id.edit_extra3);     }}
当点击More
Button以后咱们首要会调用findViewById()办法将ViewStub的实例获取到,拿到ViewStub的实例以后就很简略了,调用inflate()办法或许setVisibility(View.VISIBLE)都能够将躲藏的规划给加载出来,而加载的这个规划即是刚才在XML傍边装备的profile_extra规划。
调用inflate()办法以后会将加载出来的规划进行回来,以后咱们就能够对这个规划进行任意的操作了,再次躲藏显现,或许获取子元素的实例等。留意这儿我对ViewStub的实例进行了一个非空判别,这是由于ViewStub在XML中界说的id只在一开始有用,一旦ViewStub中指定的规划加载以后,这个id也就失利了,那么此时findViewById()得到的值也会是空。
如今咱们从头运转一下程序,界面如下图所示:

能够看到,界面上只要一个More按钮,ViewStub是彻底不占用任何空间的。然后点击一下More按钮,新的界面如下所示:

没有疑问,profile_extra.xml中界说的规划现已加载出来了,并且显现的方位也是在More按钮和OK按钮之间,恰是ViewStub控件界说的方位,说明咱们确完结已将ViewStub成功运用起来了。
别的需求提示咱们一点,ViewStub所加载的规划是不能够运用标签的,因而这有也许致使加载出来的规划存在着剩余的嵌套构造,详细怎么去取舍就要依据各自的实际状况来决议了,关于那些躲藏的规划文件构造适当复杂的状况,运用ViewStub仍是一种适当不错的挑选的,即便增加了一层无用的规划构造,依然仍是利大于弊。
通过四篇文章的学习,咱们现已把握了不少能够进步Android应用程序功用的窍门,这些窍门多数都是来自于Android
Doc,我也是从中选取了一些感受对比实用的有些,然后又参加了自个的了解出现给咱们。假如咱们想要继续学习更多关于功用优化的窍门,能够到这个网址上阅览更多内容
http://developer.android.com/training/best-performance.html
好的,那么最好功用实习系列的文章就到此结束,谢谢咱们有耐性看到最后。






优质IT资源分享社区为你提供此文。
站有大量优质android教程视频,资料等资源,包含android基础教程,高级进阶教程等等,教程视频资源涵盖传智播客,极客学院,达内,北大青鸟,猎豹网校等等IT职业培训机构的培训教学视频,价值巨大。欢迎点击下方链接查看。

android教程视频
优质IT资源分享社区(www.itziyuan.top)
一个免费,自由,开放,共享,平等,互助的优质IT资源分享网站。
专注免费分享各大IT培训机构最新培训教学视频,为你的IT学习助力!

!!!回帖受限制请看点击这里!!!
!!!资源失效请在此版块发帖说明!!!

[PS:按 CTRL+D收藏本站网址~]

——“优质IT资源分享社区”管理员专用签名~

本版相似帖子

游客