我们在开发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. REST架构

    网络上的所有事物都被抽象为资源(resource): 每个资源对应一个唯一的资源标识符(resource identifier): 通过通用的连接器接口(generic connector inter ...

  2. file文件的操作

    <?php //echo readfile('D:\\123.txt');//读取文件内容第一种方式,返回字符串,但是带有长度 echo '<br>'; //var_dump(fil ...

  3. IOS第五课——Gesture and TableView

    这一次我们要学习Gesture.TableView.AlertView三种技术. 一.Gesture 在iOS中,可以使用系统内置的手势识别(GestureRecognizer),也可以创建自己的手势 ...

  4. 字符串截取函数substr()

    substr(参数1,参数2[,参数3]); 该系统函数返回被截后的子字符串,它接受2个必选参数,参数1为要截取的字符串,参数2为截取的开始位置,参数3可选,表示截取长度. 例子:substr(&qu ...

  5. 4817 江哥的dp题d

    4817 江哥的dp题d  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 已知1-N的排列P的LIS(最长上 ...

  6. MakeCode 递归生成资源文件

    static void yieldDir(DirectoryInfo dir, int depth, StringBuilder sb1, StringBuilder sb2) { var first ...

  7. cpu负载和利用率

    理解Linux系统负荷 linux里的CPU负载

  8. Java调用C/C++编写的第三方dll动态链接库(zz)

    这里主要用的方法是JNI.在网上查资料时看到很多人说用JNI非常的复杂,不仅要看很多的文档,而且要非常熟悉C/C++编程.恐怕有很多人在看到诸如此类的评论时已经决定绕道用其他方法了.本文将做详细的介绍 ...

  9. PRML读书会第十四章 Combining Models(committees,Boosting,AdaBoost,决策树,条件混合模型)

    主讲人 网神 (新浪微博: @豆角茄子麻酱凉面) 网神(66707180) 18:57:18 大家好,今天我们讲一下第14章combining models,这一章是联合模型,通过将多个模型以某种形式 ...

  10. 写个PHP框架吧

    肯定会问:现在的PHP框架那么多了,为什么还要写一个PHP框架呢? 1.时代:PHP7来了,现在的所有框架都是基于PHP5.x的.到时候PHP7正式推广出来,现有的框架都不能发挥PHP7的最大性能优势 ...