思路很简单:将软件里用到的大量重复的页面布局抽象出来,编写成一个抽象的Activity类,然后在实现具体页面时继承它,并且在主内容空白区填入需要的内容。

例如在最近开发的一款资讯类应用中,每张页面上面都有一个顶栏,上面有两个按钮,按钮中间是一行标题文字。按钮上的文字及点击后的功能在每个页面中可能会都不相同。如下图所示的。

面对这样一个页面的需求,我们可以设计出一个基本的页面模板AbstractAc1,代码如下所示。

  1. /**
  2. * 通用页面模板1:含上栏,包括左右两个按钮,一个title文字区
  3. * @author zhe.yangz
  4. */
  5. public class AbstractAc1 extends BaseActivity {
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.abac_1);
  10. }
  11. /**
  12. * 设置主内容区域的layoutRes
  13. * @param layoutResId
  14. */
  15. public void alabSetContentView(int layoutResId) {
  16. LinearLayout llContent = (LinearLayout) findViewById(R.id.llContent1);
  17. LayoutInflater inflater = (LayoutInflater) getSystemService(
  18. Context.LAYOUT_INFLATER_SERVICE);
  19. View v = inflater.inflate(layoutResId, null);
  20. llContent.addView(v);
  21. }
  22. /**
  23. * 隐藏左侧按钮
  24. */
  25. public void alabHideButtonLeft(boolean bSetHide) {
  26. Button bt = alabGetButtonLeft();
  27. if (null != bt) {
  28. if (bSetHide) bt.setVisibility(View.INVISIBLE);
  29. else bt.setVisibility(View.VISIBLE);
  30. }
  31. }
  32. /**
  33. * 隐藏右侧按钮
  34. */
  35. public void alabHideButtonRight(boolean bSetHide) {
  36. Button bt = alabGetButtonRight();
  37. if (null != bt) {
  38. if (bSetHide) bt.setVisibility(View.INVISIBLE);
  39. else bt.setVisibility(View.VISIBLE);
  40. }
  41. }
  42. /**
  43. * 得到模板上导航栏的左侧按钮,一般为[返回]
  44. * @return 成功则返回Button对象,失败则返回null。
  45. */
  46. public Button alabGetButtonLeft() {
  47. return (Button) findViewById(R.id.btBack1);
  48. }
  49. /**
  50. * 得到模板上导航栏的右侧按钮,一般为[刷新]
  51. * @return 成功则返回Button对象,失败则返回null。
  52. */
  53. public Button alabGetButtonRight() {
  54. return (Button) findViewById(R.id.btRefresh1);
  55. }
  56. /**
  57. * 设置模板上导航栏中间的标题文字
  58. * @param titleText
  59. * @return 修改成功返回true,失败返回false
  60. */
  61. public boolean alabSetBarTitleText(String titleText) {
  62. TextView tv = (TextView) findViewById(R.id.txBarTitle1);
  63. if (null != tv) {
  64. tv.setText(titleText);
  65. return true;
  66. }
  67. return false;
  68. }
  69. }

我们创建了一张模板页面,然后在应用中的实际页面继承于它。这样,每张继承的页面都可以拥有类似的顶栏布局,并且代码简洁。下面就是继承的例子。

  1. /**
  2. * 样例页面
  3. * @author zhe.yangz
  4. */
  5. public class HomeActivity extends AbstractAc1 {
  6. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. alabSetContentView(R.layout.ac_home);
  10. setTopBarAndAction();
  11. }
  12. private void setTopBarAndAction() {
  13. alabSetBarTitleText("TEST HOME"); // 设置Title标题
  14. alabGetButtonLeft().setText("LeftBt"); // 设置左按钮上的文字
  15. alabGetButtonRight().setText("RightBt"); // 设置右按钮上的文字
  16. alabGetButtonRight().setOnClickListener(new OnClickListener() {
  17. @Override
  18. public void onClick(View v) {
  19. // 按钮执行事件
  20. // ...
  21. }
  22. });
  23. }
  24. }

就完成了一张具有如下顶栏效果的页面,页面的背景、按钮配色等效果在AbstractAc1中定义。

alabSetContentView()是在AbstractAc1中定义的方法,在衍生类中调用该方法,传入一个界面定义xml,方法中实现了 使用LayoutInflater生成view,使得这个页面中定义的主内容区的界面xml会和原来AbstractAc1的界面xml合并在一起,成为 一个完整的页面。有些情况下,左右按钮可以单独或一起隐藏,可以使用AbstractAc1中定义的alabHideButtonLeft和 alabHideButtonRight进行设置。

使用模板化方式开发界面,目前我们开发的Android应用中的Activity的层次结构大致如下。

自定义BaseActivity的更多相关文章

  1. Android:自定义BaseActivity基类

    使用BaseActivity可以封装一些重复代码例如设置标题栏颜色,封装一些工具类... 主要功能: 封装Toast 新建一个BaseActivity继承自Activity package com.o ...

  2. Android 自定义ToolBar详细使用

    自定义xml设置ToolBar,通过menu文件扩展选项,通过继承baseactivity使用 1.ToolBar布局 <?xml version="1.0" encodin ...

  3. Android 谈谈封装那些事 --BaseActivity 和 BaseFragment(二)

      1.前言 昨天谈了BaseActivity的封装,Android谈谈封装那些事--BaseActivity和BaseFragment(一)有很多小伙伴提了很多建议,比如: 通用标题栏可以自定义Vi ...

  4. 自定义Toast和RatingBar的简单用例

    Toast是一个包含用户点击消息.Toast类会帮助你创建和显示这些.Android中的Toast是一种简易的消息提示框. 当视图显示给用户,在应用程序中显示为浮动 向右划动五角星增加 单击按钮显示自 ...

  5. setFeatureInt、android 自定义标题栏

    Android 自带的toolbar 往往不能很好的的满足我们的个性化要求.因此我们经常使用自定的的标题栏.而Android系统本身也允许我们自定以标题栏. 记录一下,自定义标题栏常遇到的问题.先上效 ...

  6. Android 自定义Activity基类与TitleBar

    我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字.TitleBar上的点击事件,如果给每一个Activity都写一遍 ...

  7. android baseActivity

    package newdemo.jeno.designdemo.activitynew; import android.os.Bundle;import android.support.annotat ...

  8. [原创]自定义BaseAcitivity的实现,统一activity的UI风格样式

        在开发过程中经常遇到多个activity是同一种样式类型的情况,如果分别对其进行UI的布局,不但比较繁琐,而且后续维护过程人力成本很高,不利于敏捷开发.解决的方案是采用抽象后的BaseActi ...

  9. android自定义listview实现圆角

    在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种 ...

随机推荐

  1. js时间转变

    1.转换为标准时间 var parserDate = function (date) { var t = Date.parse(date); if (!isNaN(t)) { return new D ...

  2. 【算法笔记】B1052 卖个萌

    题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805273883951104 #include <math ...

  3. Mac下安装Iterm2终端工具

    一般Iterm2是结合oh-my-zsh一起使用,但是如果不喜欢zsh也可以单独使用.Iterm2有个亮点就是可以通过快捷键快速启动. 安装步骤: 1.下载: http://www.iterm2.co ...

  4. Android:刚6瓶啤酒4两56度白酒下肚,居然20分钟做了一手机版网站 !

    刚6瓶啤酒4两56度白酒下肚,居然20分钟不到时间做了一手机版网站 !人有多大潜力你知道吗? 大家有兴趣的可以用手机或微信打开 http://xh.yunxunmi.com/  看看俺这酒后之做! 更 ...

  5. nodejs(四) --- cluster模块详解

    什么是cluster模块,为什么需要cluster模块?  cluster在英文中有集.群的意思. nodejs默认是单进程的,但是对于多核的cpu来说, 单进程显然没有充分利用cpu,所以,node ...

  6. 关闭mac自带apache的启动。

    关闭mac自带apache的启动. sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 如果哪天 ...

  7. python-wsgi测试服务器

    #!/usr/bin/python from wsgiref.simple_server import make_server def application(environ,start_respon ...

  8. linux mint 19安装 kvm 软件包

    1 我的处理器是2700x 首先安装cpu检测 sudo apt-get install cpu-checker 2 查看cpu内核 egrep -c '(vmx|svm)' /proc/cpuinf ...

  9. C 扩展库 - mysql API CRUD

    CRUD table create table if not exists `student` ( `id` int auto_increment, `name` varchar(16) not nu ...

  10. (转载)GRASP职责分配原则

    GRASP (职责分配原则) 要学习设计模式,有些基础知识是我们必须要先知道的,设计模式是关于类和对象的一种高效.灵活的使用方式,也就是说,必须先有类和对象,才能有设计模式的用武之地,否则一切都是空谈 ...