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

面对这样一个页面的需求,我们可以设计出一个基本的页面模板AbstractAc1,代码如下所示。
<?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>
/**

* 通用页面模板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;

}

}
我们创建了一张模板页面,然后在应用中的实际页面继承于它。这样,每张继承的页面都可以拥有类似的顶栏布局,并且代码简洁。下面就是继承的例子。
就完成了一张具有如下顶栏效果的页面,页面的背景、按钮配色等效果在AbstractAc1中定义。
2011-10-5 16:52 上传 下载附件 (5.19 KB)
alabSetContentView()是在AbstractAc1中定义的方法,在衍生类中调用该方法,传入一个界面定义xml,方法中实现了使用LayoutInflater生成view,使得这个页面中定义的主内容区的界面xml会和原来AbstractAc1的界面xml合并在一起,成为一个完整的页面。有些情况下,左右按钮可以单独或一起隐藏,可以使用AbstractAc1中定义的alabHideButtonLeft和alabHideButtonRight进行设置。
使用模板化方式开发界面,目前我们开发的Android应用中的Activity的层次结构大致如下。
2011-10-5 16:52 上传 下载附件 (5.01 KB)
这样模板化的页面探索的实践被用在我们目前Android应用开发中。大致估计一下,界面代码比原来减少40%,减少了冗余,也间接提高了软件质量和可维护性,极大提升了业务需求变化带来的快速反应能力。

更多相关文章

  1. Android小项目之十二 设置中心的界面
  2. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框
  3. 内存泄漏,关于异步回调导致的内存泄漏,使用LeakCanary检测内存泄漏
  4. Android(安卓)开发者从0到1发布一个微信小程序的采坑过程——使
  5. Android和iPhone应用程序界面布局示例
  6. Android中图片实现按钮点击效果
  7. Android移动应用界面的模板化设计【自定义BaseActivity】
  8. Android(安卓)4.0 ICS 用户界面概述
  9. Android(安卓)popupWindow的使用

随机推荐

  1. 自定义加载动画的两种实现方式
  2. 设置activity背景图片
  3. android如何自定义style
  4. ListView特效2(列表拖拽)
  5. Android(安卓)自定义RadioButton的样式
  6. android让图片等比例缩放
  7. Android(安卓)为按键添加声音(转载)
  8. android之AIDL跨进程通信详解 (四)AIDL中
  9. 【Android(安卓)自定义控件】自定义View
  10. Android杀死正在运行的进程