在Android应用开发过程中,屏幕上控件的布局代码和程序的逻辑代码通常是分开的。界面的布局代码是放在一个独立的xml文件中的,这个文件里面是树型组织的,控制着页面的布局。通常,在这个页面中会用到很多控件,控件会用到很多的资源。Android系统本身有很多的资源,包括各种各样的字符串、图片、动画、样式和布局等等,这些都可以在应用程序中直接使用。这样做的好处很多,既可以减少内存的使用,又可以减少部分工作量,也可以缩减程序安装包的大小。

原文博客地址:http://www.apkbus.com/blog-919651-76902.html

[]()1)利用系统定义的id

在xml文件中引用系统的id,只需要加上“@android:”前缀即可。如果是在Java代码中使用系统资源,和使用自己的资源基本上是一样的。不同的是,需要使用android.R类来使用系统的资源,而不是使用应用程序指定的R类。这里如果要获取ListView可以使用android.R.id.list来获取。

<ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent"/>

[]()2)利用系统的图片资源

Android中没有公开的资源,在xml中直接引用会报错。除了去找到对应资源并拷贝到我们自己的应用目录下使用以外,我们还可以将引用“@android”改成“@*android”解决。比如上面引用的附件图标,可以修改成下面的代码。

android:icon="@*android:drawable/ic_menu_attachment"

修改后,再次Build工程,就不会报错了。

[]()3)利用系统的字符串资源

如果使用系统的字符串,默认就已经支持多语言环境了。如上述代码,直接使用了@android:string/yes和@android:string/no,在简体中文环境下会显示“确定”和“取消”,在英文环境下会显示“OK”和“Cancel”。

[]()4)利用系统的Style

    android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" />

其中android:textAppearance="?android:attr/textAppearanceMedium"就是使用系统的style。需要注意的是,使用系统的style,需要在想要使用的资源前面加“?android:”作为前缀,而不是“@android:”。

[]()5)利用系统的颜色定义

[]()6)提取共同的组件,通过include引入

<include layout="@layout/navigator_bar" />

一般情况下,在项目的初期就能够大致确定整体UI的风格。所以早期的时候就可以做一些规划,将通用的模块先写出来。

下面是可能可以抽出的共用的布局:

1)背景。有的应用在不同的界面里会用到统一的背景。后期可能会经常修改默认背景,所以可以将背景做成一个通用模块。

2)头部的标题栏。如果应用有统一的头部标题栏,就可以抽取出来。

3)底部的导航栏。如果应用有导航栏,而且大部分的Activity的底部导航栏是相同的,就可以将导航栏写成一个通用模块。

4)ListView。大部分应用都会用到ListView展示多条数据。项目后期可能会经常调整ListView的风格,所以将ListView作为一个通用的模块比较好。

[]()7)延迟加载隐藏的View

有时候,我们的页面中可能会包含一些布局,这些布局默认是隐藏的,当用户触发了一定的操作之后,隐藏的布局才会显示出来。比如,我们有一个Activity用来显示好友的列表,当用户点击Menu中的“导入”以后,在当前的Activity中才会显示出一个导入好友的布局界面。从需求的角度来说,这个导入功能,一般情况下用户是不使用的。即大部分时候,导入好友的布局都不会显示出来。这个时候,就可以使用延迟加载的功能。

ViewStub是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。当ViewStub被设置为可见,或者调用inflate()函数时,才会真的去加载这个布局资源文件。该ViewStub在加载视图时会在父容器中替换它本身。因此,ViewStub会一直存在于视图中,直到调用setVisibility(int)或者inflate()为止。ViewStub的布局参数会随着加载的视图数一同被添加到ViewStub父容器。同样,也可以通过使用inflated Id属性来定义或重命名要加载的视图对象的Id值。

<ViewStub android:id="@+id/stub_import" android:inflatedId="@+id/panel_import" android:layout="@layout/progress_overlay" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" />

通过“stub_import”这个id可以找到被定义的ViewStub对象。加载布局资源文件“progress_overlay”后,ViewStub对象从其父容器中移除。可以通过“panel_import”这个id找到由布局资源“progress_overlay”创建的View。

((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE); // 或者 View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();

Android性能优化之UI实战相关推荐

  1. Android性能优化——腾讯、字节、阿里、百度、网易等互联网公司项目实战+案例分析(附PDF)

    前言 当我们还在用按键.滑盖.翻盖手机的时候,全触屏手机来了; 当我们觉得二维码这项发明没有意义的时候,支付宝和微信等狠狠地给了我们响亮的耳光; 当我们以为扫码支付只有支付宝的时候,微信支付来了; 当 ...

  2. 太牛了!我把阿里、腾讯、字节跳动、美团等Android性能优化实战整合成了一个PDF文档

    安卓开发大军浩浩荡荡,经过近十年的发展,Android技术优化日异月新,如今Android 11.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS. 但是,到了各大厂商手 ...

  3. Android面试-Android性能优化和内存优化、APP启动速度一线大厂的实战案例解析

    一.Android 内存管理机制 二.优化内存的意义 三.避免内存泄漏 四.优化内存空间 五.图片管理模块的设计与实现 六.总结 深入探索Android内存优化 第一章.重识内存优化 第二章.常见工具 ...

  4. 全面解析Android性能优化,含腾讯、阿里、百度、京东、美团、爱奇艺等大厂实战解析

    前言 安卓开发大军浩浩荡荡,经过十多年的发展.红利期已过,现在是增量有限,存量厮杀,从争夺用户到争夺时长.不管是用户也好.企业也好,都对 App 的用户体验和性能提出了更高的要求. 如果你已经有 2 ...

  5. Android主线程耗时动画卡顿,Android性能优化实战之界面卡顿

    原标题:Android性能优化实战之界面卡顿 作者:红橙Darren https://www.jianshu.com/p/18bb507d6e62 今天是个奇怪的日子,有三位同学找我,都是关于界面卡顿 ...

  6. Android 性能优化

    为什么80%的码农都做不了架构师?>>>    原文作者:鸿洋 原文地址:点我跳转原文 一般情况下,我们谈性能优化基本上会从以下几个方面: App启动速度优化 UI流畅度优化 内存优 ...

  7. Android性能优化典范 - 第6季

    原文出处:http://hukai.me/android-performance-patterns-season-6/ 序言 这是Android性能优化典范第6季的课程学习笔记,最近个人事情比较多,从 ...

  8. 记录一个android性能优化宝藏级总结

    发现一个android性能优化文章宝藏级总结,太赞了,感谢大佬的无私奉献总结,防止丢失,在此记录一下 传送门 复制一些目录,增加一些篇幅{嘻嘻} 优化心得和经验 抖音 Android 性能优化系列:启 ...

  9. Android性能优化的5种方案

    指标 量化性能的指标有很多,但最重要的就是以下5种: 包大小 响应时间 内存 CPU 耗电量 优化性能就是可以从以上5点入手. 包大小优化 顾名思义就是减少apk包体积大小,apk大小主要取决于res ...

最新文章

  1. 鸢尾花分类_K近邻(分类通用 数据挖掘入门与实践-实验4)
  2. 计算机人文研究生专业,西安科技大学,艺术、人文、材料、计算机、通信等专业调剂信息...
  3. aop 获取方法入参出参_Spring AOP 如何将参数传递给需要织入的方法
  4. java aop管理权限_基于spring aop 权限管理系统原型 - andyj2ee - BlogJava
  5. 2017.5.26暴力赛解题报告
  6. 目标跟踪 MOSSE(Visual Object Tracking using Adaptive Correlation Filters)
  7. clientX,clientY,screenX,screenY,offsetX,offsetY 区别测试
  8. spring boot整合Quartz 在Job类中注入其他对象报空指针异常java.lang.NullPointerException at com.sxt.quartz.QuartzDemo.e
  9. Flutter开发之——文件系统目录pathprovider
  10. qsv文件转码mp4格式过程记录
  11. vestacp 远程mysql_vestacp面板远程ftp备份脚本 | 叽叽歪歪
  12. 迅为龙芯开发板Loongnix系统烧写-loognix图形化安装
  13. error: unterminated #ifndef
  14. 基于SAML协议 实现SP 单点登录
  15. Python从C盘到D盘
  16. 阿里P7为了证明自己确实年入百万,晒出了他的工资
  17. 单引号双引号和三引号的区别
  18. JavaScript流程控制-分支结构
  19. 【前端js】实现剑指offer|leetcode(二)——数组题目集合
  20. 福昕PDF阅读器 Foxit Reader v9.6.0.25150官方正式版

热门文章

  1. SharePoint 2010版本表
  2. (原创)无废话C#设计模式之十七:Chain Of Resp.
  3. 快速集成二维码扫描,使用最新版本的zxing(2017.11.10抽取zxing代码)
  4. 获取文件绝对路径最后的文件夹名称
  5. 惠新宸:我也曾经是“不适合”编程的人
  6. 南非看世界杯通信问题全攻略(世界杯与通信1)
  7. 爬虫项目——BS4练手(1)
  8. BI在企业数字化转型中的价值
  9. 如何正确认识大数据分析
  10. 大数据技术在网络安全分析的作用