我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字。TitleBar上的点击事件,如果给每一个Activity都写一遍TitleBar是一件非常费事的事情,这个时候我们就可以重写一个Activity基类,让其他有相同点的Activity来继承这个类,从而省去了很多的重复不必要的工作。提高了效率。

如图:

两个界面拥有共同的特点,有一个我们自己定义的TitleBar,这个TitleBar属于我们自定义的基类BaseActivity,如果我们想让一个类具有这个特性,只需要继承BaseActivity并添加相应的布局即可。事件什么的都写一边就OK了。

  

BaseActivity.java

内部有一个重写的TitleBar控件,封装对应的方法对TitleBar进行操作,该类的事件将会被TitleBa调用,具体调用看TitleBar实现

  1. /**
  2. * 重写的一个Activity 的基类,在基类中实现了一个TitleBar 用TitleBar来展示一个标题
  3. * 同时定义一个Back按钮,点击的时候退出当前的Activity
  4. *
  5. * @author mingwei
  6. *
  7. */
  8. public abstract class BaseActivity extends Activity {
  9. private TitleBar mTitleBar;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. requestWindowFeature(Window.FEATURE_NO_TITLE);
  13. super.onCreate(savedInstanceState);
  14. setTheme(android.R.style.Theme_Light_NoTitleBar);
  15. }
  16. @Override
  17. public void setContentView(int layoutResID) {
  18. // TODO Auto-generated method stub
  19. super.setContentView(layoutResID);
  20. initBaseView();
  21. }
  22. public void initBaseView() {
  23. mTitleBar = (TitleBar) findViewById(R.id.base_titlebar);
  24. }
  25. public void setTitleBarBackText(String text) {
  26. // mTitleBar.setBackText(text);
  27. }
  28. public void setTitleBarTitle(String tite) {
  29. if (mTitleBar != null) {
  30. mTitleBar.setTitle(tite);
  31. }
  32. }
  33. public void setTitleBarTitle(int titleId) {
  34. if (mTitleBar != null) {
  35. mTitleBar.setTitle(getString(titleId));
  36. }
  37. }
  38. public void setTitleBarTitleDrawable(Drawable drawable){
  39. if (mTitleBar != null) {
  40. mTitleBar.setTitleRightDrawable(drawable);
  41. }
  42. }
  43. //返回键事件
  44. public void finishActivity() {
  45. finish();
  46. }
  47. public void setTitleRTBtnVisiable(int visiable) {
  48. if (mTitleBar != null) {
  49. mTitleBar.setRTBtnVisiable(visiable);
  50. }
  51. }
  52. public void setTitleRTBtnText(String text) {
  53. if (mTitleBar != null) {
  54. mTitleBar.setRTBtnText(text);
  55. }
  56. }
  57. public void setTitleRTBtnText(int textId) {
  58. if (mTitleBar != null) {
  59. mTitleBar.setRTBtnText(getString(textId));
  60. }
  61. }
  62. public void setTitleRTBtnFocusable(boolean focusable) {
  63. if (mTitleBar != null) {
  64. mTitleBar.setRTBtnFocusable(focusable);
  65. }
  66. }
  67. //中间的Title点击事件
  68. public void setCenterClick(boolean bool) {
  69. mTitleBar.setTitleClick(bool);
  70. }
  71. public void onRtBtnClick() {
  72. // titlebar左上角button的click时间
  73. }
  74. public void onCenterClick() {
  75. // titlebar中间的title点击事件
  76. }
  77. }

我们再来看看TitleBar长啥样子,TitleBar是一个封装的RelativLayout,包括一个返回键,中的Title,右边的按钮

注意:注释1的地方,Activity中的容器或者控件想到调用Activity中的方法或者属性怎么办?

例如,我在点击Back的ImageView时想让Activity finished()掉,只需要我们把容器中得到的Context强转为相应的Activity即可,之后就可以方便的调用Activity的方法了。

  1. /**
  2. * 基类BaseActivity用到的TitleBar,用来返回页面和展示当前页内容的Title信息
  3. *
  4. * @author mingwei
  5. *
  6. */
  7. public class TitleBar extends RelativeLayout implements OnClickListener {
  8. private ImageView mBack;
  9. private TextView mTitle;
  10. private TextView mRTBtn;
  11. BaseActivity mContext;
  12. public TitleBar(Context context) {
  13. this(context, null);
  14. }
  15. public TitleBar(Context context, AttributeSet attrs) {
  16. super(context, attrs, 0);
  17. }
  18. public TitleBar(Context context, AttributeSet attrs, int defStyle) {
  19. super(context, attrs, defStyle);
  20. mContext = (BaseActivity) getContext();// <span style="color:#ff0000;">注释1</span>
  21. }
  22. /**
  23. * 初始化控件
  24. */
  25. @Override
  26. protected void onFinishInflate() {
  27. super.onFinishInflate();
  28. mContext = (BaseActivity) getContext();
  29. mBack = (ImageView) findViewById(R.id.base_titlebar_back);
  30. mTitle = (TextView) findViewById(R.id.base_titlebar_title);
  31. mRTBtn = (TextView) findViewById(R.id.base_titlebar_rtbtn);
  32. mBack.setOnClickListener(this);
  33. mTitle.setOnClickListener(this);
  34. mRTBtn.setOnClickListener(this);
  35. mTitle.setClickable(false);
  36. }
  37. /**
  38. * 右边的控件是否可见
  39. */
  40. public void setRTBtnVisiable(int visiable) {
  41. mRTBtn.setVisibility(visiable);
  42. }
  43. /**
  44. * 右边控件的文版
  45. */
  46. public void setRTBtnText(String title) {
  47. mRTBtn.setText(title);
  48. }
  49. /**
  50. * 右边控件的显示颜色变化
  51. */
  52. public void setRTBtnFocusable(boolean focusable) {
  53. mRTBtn.setEnabled(focusable);
  54. if (focusable) {
  55. mRTBtn.setTextColor(getResources().getColor(R.color.base_rtbtn_clickable_color));
  56. } else {
  57. mRTBtn.setTextColor(getResources().getColor(R.color.base_rtbtn_clickunable_color));
  58. }
  59. }
  60. /**
  61. * 返回右边控件
  62. */
  63. public TextView getRTBtnTextView() {
  64. return mRTBtn;
  65. }
  66. /**
  67. * 中间控件的点击事件
  68. */
  69. public void setTitleClick(boolean bool) {
  70. mTitle.setClickable(bool);
  71. }
  72. /**
  73. * 中间控件文本</span>
  74. */
  75. public void setTitle(String title) {
  76. mTitle.setText(title);
  77. }
  78. /**
  79. * 中间控件图标</span>
  80. */
  81. public void setCompoundDrawables(Drawable drawable) {
  82. mTitle.setCompoundDrawables(null, null, drawable, null);
  83. }
  84. /**
  85. * 中间控件图标</span>
  86. */
  87. public void setTitleRightDrawable(Drawable drawable) {
  88. mTitle.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null);
  89. }
  90. /**
  91. * 控件的点击情况,分别去调用BaseActivity的方法,
  92. * 基类被重写后将在子类中调用这些方法</span>
  93. */
  94. @Override
  95. public void onClick(View v) {
  96. switch (v.getId()) {
  97. case R.id.base_titlebar_back:
  98. mContext.finishActivity();
  99. break;
  100. case R.id.base_titlebar_title:
  101. mContext.onCenterClick();
  102. break;
  103. case R.id.base_titlebar_rtbtn:
  104. mContext.onRtBtnClick();
  105. break;
  106. default:
  107. break;
  108. }
  109. }
  110. }
  1. </pre><p></p><pre>

TitleBar用到的布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <com.xiaoda.juma001.widget.TitleBar xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="@dimen/base_titlebar_height"
  5. android:background="@color/base_activity_titlebar_backcolor"
  6. android:fitsSystemWindows="true" >
  7. <ImageView
  8. android:id="@+id/base_titlebar_back"
  9. android:layout_width="@dimen/base_titlebar_back_width"
  10. android:layout_height="match_parent"
  11. android:contentDescription="@string/base_title_back_des"
  12. android:padding="@dimen/base_activity_titlebar_back_padding"
  13. android:src="@drawable/base_activity_back_nor" />
  14. <TextView
  15. android:id="@+id/base_titlebar_title"
  16. style="@style/BaseActivityTitlebarTitleStyle"
  17. android:layout_width="wrap_content"
  18. android:layout_height="match_parent"
  19. android:layout_alignBaseline="@+id/base_titlebar_back"
  20. android:layout_alignBottom="@+id/base_titlebar_back"
  21. android:layout_centerHorizontal="true" />
  22. <TextView
  23. android:id="@+id/base_titlebar_rtbtn"
  24. android:layout_width="wrap_content"
  25. android:layout_height="match_parent"
  26. android:layout_alignParentRight="true"
  27. android:layout_centerVertical="true"
  28. android:layout_marginRight="@dimen/base_titlebar_rtbutton_marginright"
  29. android:gravity="center"
  30. android:textColor="@color/base_activity_titlebar_textcolor"
  31. android:visibility="invisible" />
  32. <View
  33. android:layout_width="match_parent"
  34. android:layout_height="@dimen/base_titlebar_bottom_line_height"
  35. android:layout_alignParentBottom="true"
  36. android:background="@color/base_activity_titlebar_bottom_linecolor" />
  37. </com.xiaoda.juma001.widget.TitleBar>

写到这里就写好了,我们来看看如何使用

  1. /**
  2. * 继承BaseActivity
  3. * @author mingwei
  4. *
  5. */
  6. public class AllPictureActivity extends BaseActivity {
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.allpicture_activity);
  11. setTitleBarTitle(R.string.allpicture_title);
  12. setTitleRTBtnVisiable(View.VISIBLE);
  13. setTitleRTBtnText(R.string.allpicture_ok);
  14. setTitleBarTitleDrawable(getResources().getDrawable(R.drawable.all_picture_more_dropdown));
  15. setCenterClick(true);
  16. initView();
  17. }
  18. private void initView() {
  19. }
  20. /**
  21. * 中间的TitleBar的点击事件
  22. */
  23. @Override
  24. public void onCenterClick() {
  25. super.onCenterClick();
  26. taggleLayout();
  27. }
  28. private void taggleLayout() {
  29. }
  30. private void changeData(int i) {
  31. }
  32. /**
  33. * 返回按钮点击事件
  34. */
  35. @Override
  36. public void finishActivity() {
  37. // TODO Auto-generated method stub
  38. super.finishActivity();
  39. }
  40. /**
  41. * 右上角的按钮的点击事件
  42. */
  43. @Override
  44. public void onRtBtnClick() {
  45. super.onRtBtnClick();
  46. }
  47. }

别忘了给Activity布局文件加上TitleBar的文件引用

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical" >
  6. <include
  7. android:id="@id/base_titlebar"
  8. layout="@layout/base_activity_titlebar" />//TitleBar布局文件
  9. <GridView
  10. android:id="@+id/allpicture_grid"
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent"
  13. android:cacheColorHint="@android:color/transparent"
  14. android:columnWidth="90dip"
  15. android:gravity="center"
  16. android:horizontalSpacing="5dip"
  17. android:listSelector="@android:color/transparent"
  18. android:numColumns="auto_fit"
  19. android:stretchMode="columnWidth"
  20. android:verticalSpacing="5dip" >
  21. </GridView>
  22. </LinearLayout>

ids文件 别忘了把你这些不变的id写到ids文件中去

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <item name="base_titlebar" type="id">base_titlebar</item>
  4. </resources>

实现的界面如下图所示:

Android 自定义Activity基类与TitleBar的更多相关文章

  1. Android 自己定义Activity基类

    我们在开发App的时候有时候碰到多个界面有一个共同点的时候.比方,都有同样的TitleBar.而且TitleBar能够设置显示的文字.TitleBar上的点击事件,假设给每个Activity都写一遍T ...

  2. 命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法

    在学习NDK中,当我在项目的bin/classes目录下使用javah命令生成头文件时,出现了“错误: 无法访问android.app.Activity 找不到android.app.Activity ...

  3. javah编译class文件找不到android.app.Activity的类文件

    在android工程的根目录使用javah生成jni 头文件时候,报找不到android.app.Activity的类文件错误. 无法访问android.app.Activity是说明没有引入andr ...

  4. WPF自学入门(九)WPF自定义窗口基类

    今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...

  5. WPF 之 创建继承自Window 基类的自定义窗口基类

    开发项目时,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于 Window 自身的,但窗口的外边框及窗口移动.最小化等标题栏操作基本都是一样的.所以通过查看资料,可按如下方法创建继承 ...

  6. Android 自定义Activity的标题栏(Titlebar)

    缺省的情况下,通常见到Activity的标题栏(Titlebar)是这样的(红色框内): HandleContacts是Activity的标题.有时候,我们希望能改变一下这样单调的状况.比如,要在标题 ...

  7. 【Android进阶】为什么要创建Activity基类以及Activity基类中一般有哪些方法

    现在也算是刚刚基本完成了自己的第一个商业项目,在开发的过程中,参考了不少人的代码风格,然而随着工作经验的积累,终于开始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. ...

  8. 【Android先进】我们为什么要创建Activity基类Activity什么是一般的基类方法

    今天,它可以被视为只是基本完成了其首个商业项目,在发展过程中,风格,然而随着工作经验的积累.最终開始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. 首先,在如今的项目 ...

  9. Android:自定义BaseActivity基类

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

随机推荐

  1. VS 的编译选项 build下的 platform target -- Any CPU和x86有什么影响?

    VS 的编译选项 build下的platform -- Any CPU和x86有什么影响? 现在的问题是,我的一个assembly用Any CPU编译就不能在64位系统下运行了,但是用x86编译就ok ...

  2. java 24 - 10 GUI 之 四则预算的数据校验

    我想要在校验的过程中,如果输入到操作数中的不是数字,则弹出提醒框: 类 JOptionPane  有助于方便地弹出要求用户提供值或向其发出通知的标准对话框 方法名 描述 showConfirmDial ...

  3. 包含文件函数include与require的区别

    include或include_once一般用于动态包含,所谓动态包含就是根据不同条件包含不同文件 require或require_once一般用于静态包含,比如包含一个html文件的头部或者尾部 如 ...

  4. NOIP2015 Revenge

    辣鸡出题人,毁我比赛,颓我精神,耗我钱财,废我青春. 去年成绩惨不忍睹就不说了...好像是100+80+0+100+50+60. 大概列一下算法. 幻方:模拟 #include <iostrea ...

  5. Git管理项目实例说明-记录和跟踪项目

    假设一个HTML项目,使用Git来记录和跟踪这个项目,包括以下内容:1)创建版本库.2)添加与修改文件.3)创建新分支.4)打标签并整理版本库.5)克隆版本库. 1.创建版本库 Creating a ...

  6. Python的高级特性7:闭包和装饰器

    本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...

  7. BZOJ 3295: [Cqoi2011]动态逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3865  Solved: 1298[Submit][Sta ...

  8. NET代码重构

    记一次.NET代码重构   好久没写代码了,终于好不容易接到了开发任务,一看时间还挺充足的,我就慢慢整吧,若是遇上赶进度,基本上直接是功能优先,完全不考虑设计.你可以认为我完全没有追求,当身后有鞭子使 ...

  9. QT UDP聊天小程序

    利用QT的UDP技术,实现两个QT程序之间的聊天程序. #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include < ...

  10. java:如何用代码控制H2 Database启动

    1.纯手动start/stop package com.cnblogs.yjmyzz.h2; import java.sql.Connection; import java.sql.DriverMan ...