我们在开发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. AJAX、JQUERY 工作遇到的知识点

    泽浜商城关联公司知识点总结 1.关联公司的时候,根据用户ID,在数据库中用户表中关联公司ID,公司的列表通过查找公司表 ,然后抓取所有公司的名称和ID.关联的时候只需要根据公司name和ID进行关联. ...

  2. js双层动画幻灯

    js双层动画幻灯 点击下载

  3. SharePoint Foundation 2013 with SP1

    终于支持在 Windows Server 2012 R2 上安装了. 下载 另外,还有一个针对SharePoint Foundation 2013的重要更新.可以在安装SP1之前或之后安装. Micr ...

  4. Memcached的安装和使用以及nginx整合memcached

    一.模块的安装启动 wget http://cdnetworks-kr-2.d1.sourceforge.net/project/levent/libevent/libevent-2.0/libeve ...

  5. oracle 取前10条记录

    1.oracle 取前10条记录 1) select * from tbname where rownum < 11; 2) select * from (select * from tbnam ...

  6. linux:nohup 不生成 nohup.out的方法

    nohup java -jar /xxx/xxx/xxx.jar >/dev/null 2>&1 & 关键在于最后的 >/dev/null 2>&1 部 ...

  7. TinyFrame升级之十:WCF Rest Service注入IOC的心

    由于在实际开发中,Silverlight需要调用WebService完成数据的获取,由于之前我们一直采用古老的ASMX方式,生成的代理类不仅难以维护,而且自身没有提供APM模式的调用方式,导致在Sin ...

  8. CodeSmith操作Access时字段的排序问题

    最近在用CodeSmith操作写ACCESS数据库的代码模版,发现CodeSmith默认的字段顺序与ACCESS中表的字段顺序不一致. 首先在ACCESS数据库中建一个测试表Test,并添加ID.Na ...

  9. 模拟MVC-WebForm实现ModelBinding

    (一) 前言                                                                           用ASP.NET MVC的时候,我们都 ...

  10. 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays

    一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...