Android移动应用界面的模板化设计
Android没有像苹果开发那样功能强大的界面开发工具,本身 ADT插件提供的界面编辑能力有限,没办法刻画所有的界面情况;Android的界面xml代码可以进行人工修改,而Iphone的全部在图形界面上拖动 完成,可没提供任何方式的代码级修改。Android的UI设计开发过程非常繁琐,容易出错,需要很长时间调节界面细节,开发过Android应用的人肯 定深有同感。用几年前的网页设计来打个比方,开发Iphone的软件界面就好比是用Frontpage弄点控件拖成一张页面,而开发Android更接近 于闭着眼睛在Notepad里一行行的写html标签。为了使开发Android应用更加简便快捷,减少代码冗余,增强软件质量,在咨询行情的开发上我们 大量使用了模板化的页面。
思路很简单:将软件里用到的大量重复的页面布局抽象出来,编写成一个抽象的Activity类,然后在实现具体页面时继承它,并且在主内容空白区填入需要的内容。
例如在最近开发的一款资讯类应用中,每张页面上面都有一个顶栏,上面有两个按钮,按钮中间是一行标题文字。按钮上的文字及点击后的功能在每个页面中可能会都不相同。如下图所示的。

面对这样一个页面的需求,我们可以设计出一个基本的页面模板AbstractAc1,代码如下所示。
- /**
- * 通用页面模板1:含上栏,包括左右两个按钮,一个title文字区
- * @author zhe.yangz
- */
- public class AbstractAc1 extends BaseActivity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.abac_1);
- }
- /**
- * 设置主内容区域的layoutRes
- * @param layoutResId
- */
- public void alabSetContentView(int layoutResId) {
- LinearLayout llContent = (LinearLayout) findViewById(R.id.llContent1);
- LayoutInflater inflater = (LayoutInflater) getSystemService(
- Context.LAYOUT_INFLATER_SERVICE);
- View v = inflater.inflate(layoutResId, null);
- llContent.addView(v);
- }
- /**
- * 隐藏左侧按钮
- */
- public void alabHideButtonLeft(boolean bSetHide) {
- Button bt = alabGetButtonLeft();
- if (null != bt) {
- if (bSetHide) bt.setVisibility(View.INVISIBLE);
- else bt.setVisibility(View.VISIBLE);
- }
- }
- /**
- * 隐藏右侧按钮
- */
- public void alabHideButtonRight(boolean bSetHide) {
- Button bt = alabGetButtonRight();
- if (null != bt) {
- if (bSetHide) bt.setVisibility(View.INVISIBLE);
- else bt.setVisibility(View.VISIBLE);
- }
- }
- /**
- * 得到模板上导航栏的左侧按钮,一般为[返回]
- * @return 成功则返回Button对象,失败则返回null。
- */
- public Button alabGetButtonLeft() {
- return (Button) findViewById(R.id.btBack1);
- }
- /**
- * 得到模板上导航栏的右侧按钮,一般为[刷新]
- * @return 成功则返回Button对象,失败则返回null。
- */
- public Button alabGetButtonRight() {
- return (Button) findViewById(R.id.btRefresh1);
- }
- /**
- * 设置模板上导航栏中间的标题文字
- * @param titleText
- * @return 修改成功返回true,失败返回false
- */
- public boolean alabSetBarTitleText(String titleText) {
- TextView tv = (TextView) findViewById(R.id.txBarTitle1);
- if (null != tv) {
- tv.setText(titleText);
- return true;
- }
- return false;
- }
- }
我们创建了一张模板页面,然后在应用中的实际页面继承于它。这样,每张继承的页面都可以拥有类似的顶栏布局,并且代码简洁。下面就是继承的例子。
- /**
- * 样例页面
- * @author zhe.yangz
- */
- public class HomeActivity extends AbstractAc1 {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- alabSetContentView(R.layout.ac_home);
- setTopBarAndAction();
- }
- private void setTopBarAndAction() {
- alabSetBarTitleText("TEST HOME"); // 设置Title标题
- alabGetButtonLeft().setText("LeftBt"); // 设置左按钮上的文字
- alabGetButtonRight().setText("RightBt"); // 设置右按钮上的文字
- alabGetButtonRight().setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // 按钮执行事件
- // ...
- }
- });
- }
- }
就完成了一张具有如下顶栏效果的页面,页面的背景、按钮配色等效果在AbstractAc1中定义。

alabSetContentView()是在AbstractAc1中定义的方法,在衍生类中调用该方法,传入一个界面定义xml,方法中实现了使用
LayoutInflater生成view,使得这个页面中定义的主内容区的界面xml会和原来AbstractAc1的界面xml合并在一起,成为一个
完整的页面。有些情况下,左右按钮可以单独或一起隐藏,可以使用AbstractAc1中定义的alabHideButtonLeft和
alabHideButtonRight进行设置。
使用模板化方式开发界面,目前我们开发的Android应用中的Activity的层次结构大致如下。

这样模板化的页面探索的实践被用在我们目前Android应用开发中。大致估计一下,界面代码比原来减少40%,减少了冗余,也间接提高了软件质量和可维
护性,极大提升了业务需求变化带来的快速反应能力。接下去我们希望能够继续深入探索,找到更多的提升移动软件界面开发效率和质量的方法,也希望有好想法的
同学和我们深入交流,共同探讨,博采众长。
补充:
文中模板1中所用的布局定义文件abac_1.xml忘给出了,代码如下,
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent" android:background="@color/section_bgcolor">
- <!-- 顶栏 -->
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="43dp"
- android:padding="5dp"
- android:background="@drawable/topbar_bg"
- android:orientation="horizontal"
- android:gravity="center" >
- <Button style="@style/AliBt" mce_style="@style/AliBt"
- android:id="@+id/btLeft"
- android:text="Left" />
- <Spinner android:id="@+id/sp_HY"
- android:visibility="invisible"
- android:layout_width="0dp"
- android:layout_height="0dp"/>
- <TextView style="@style/AliBarTitle" mce_style="@style/AliBarTitle"
- android:id="@+id/txBarTitle1"
- android:text="" />
- <Button style="@style/AliBt" mce_style="@style/AliBt"
- android:id="@+id/btRight"
- android:text="Right" />
- </LinearLayout>
- <!-- 主内容框架 -->
- <LinearLayout
- android:id="@+id/llContent1"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="0dp"
- android:layout_weight="1">
- </LinearLayout>
- </LinearLayout>
Android移动应用界面的模板化设计的更多相关文章
- 11款扁平化设计的 Twitter Bootstrap 主题和模板
扁平化设计和 Bootstrap 框架是2013年网页设计领域的两大设计潮流.把这两者集合起来不是件容易的事情,使用下面这些主题和模板将节省我们的开发时间,因为我们可以修改已有的基础代码,而不是从零开 ...
- 16个时髦的扁平化设计的 HTML5 & CSS3 网站模板
创建网站最好办法之一是使用现成的网站模板或使用开源 CMS 应用程序.所以,今天这篇文章给大家带来的是16款基于 HTML5 & CSS3 的精美的扁平风格网站模板,大家可以借助这些优秀的网站 ...
- C# winform 界面美化技巧(扁平化设计)
关于C#界面美化的一些小技巧 在不使用第三方控件如 IrisSkin 的前提下,依然可以对winform做出让人眼前一亮的美化 首先,我们先来实现主界面的扁平化 此处分为两个步骤,第一步是更改winf ...
- 利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出
我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的 ...
- Android核心分析之二十Android应用程序框架之无边界设计意图
Android应用程序框架1 无边界设计理念 Android的应用框架的外特性空间的描述在SDK文档(http://androidappdocs.appspot.com/guide/topics/fu ...
- Android应用程序框架之无边界设计意图
Android的应用框架的外特性空间的描述在SDK文档有十分清楚的描述,Android应用的基本概念,组件生命周期等等有详细的描述.在外特性空间中,Android提供了Activity,Service ...
- 10、ERP设计之系统基础管理(BS)- 平台化设计
ShareERP 2013-09-03 ERP业务平台化是每个软件提供商必须要进行的趋势,传统定制化路线已死,不能走定制化的老路了.以往最大问的题是不能累积和沉淀技术及提升项目业务管理能力,其次是管理 ...
- Material Design(原质化设计)视觉设计语言规范 踏得网镜像
Android 5.0 Lollipop(棒棒糖,也就是之前的代称Android L)全面实践了谷歌最新研发的 Material Design 设计语言规范,只是该设计规范并不是仅针对移动平台. 我们 ...
- 扁平化设计的最新趋势 – 长阴影(Long Shadow)
随着互联网的发展,网页设计变得越来越复杂,如今设计的外观和感觉实现网站功能说使用的开发技术一样重要.互联网的功能远远不只是基本的信息共享,现在人们对网站的期望是远远大于几年前的. 如今,HTML5 & ...
随机推荐
- 实体框架 Code First
原文:https://msdn.microsoft.com/zh-cn/en-zn/data/jj591621
- Git 全局设置
Git 全局设置: git config --global user.name "ASxx" git config --global user.email "123456 ...
- Javascript-逻辑或(||)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Ajax—web中ajax的常用方式
什么Web2.0的特点? 1:注重用户贡献度 2:内容聚合RSS协议(每小块都个性化,单独加载单独请求,不用全部刷新--Ajax) 3:更丰富的用户体验 Ajax的概念? "Asynchro ...
- Linux命令:查看文件内容cat|tac|more|less|head|tail|nl|od
查看文件内容的命令;cat, tac, more, less, head, tail, nl, 1)cat 由第一行开始显示文档内容,一直显示到最后 2)tac 从最后一行开始显示,一直显示到第一行内 ...
- 通过Java 线程堆栈进行性能瓶颈分析
改善性能意味着用更少的资源做更多的事情.为了利用并发来提高系统性能,我们需要更有效的利用现有的处理器资源,这意味着我们期望使 CPU 尽可能出于忙碌状态(当然,并不是让 CPU 周期出于应付无用计算, ...
- P2322 [HNOI2006]最短母串问题
P2322 [HNOI2006]最短母串问题 AC自动机+bfs 题目要求:在AC自动机建的Trie图上找到一条最短链,包含所有带结尾标记的点 因为n<12,所以我们可以用二进制保存状态:某个带 ...
- mysql 批处理文件出错后继续执行
在升级批处理sql脚本的时候,由于各种编写的不规范.不可重复执行,我们通常希望在sql脚本出错后不中止,而是执行完成.虽然这些问题可通过编写可重复执行的mysql存储过程比如add_column/dr ...
- Python 自学基础(四)——time模块,random模块,sys模块,os模块,loggin模块,json模块,hashlib模块,configparser模块,pickle模块,正则
时间模块 import time print(time.time()) # 当前时间戳 # time.sleep(1) # 时间延迟1秒 print(time.clock()) # CPU执行时间 p ...
- 09: python基础补充
1.1 闭包 1.闭包概念 1. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包 2. 一般情况下,在我们认知当中,如果一个函数 ...