我们在开发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. 在ios android设备上使用 Protobuf (使用dll方式)

    http://game.ceeger.com/forum/read.php?tid=13479 如果你的工程可以以.Net 2.0 subset模式运行,请看这个帖子中的方法. 地址:http://g ...

  2. nginx的主要用途

    1.反向代理加速(无缓存),简单的负载均衡和容错  : 问题一:为什么反向代理可以做加速服务器? 反向代理接受发给web服务器的真实请求,但与web服务器不同的是,它们可以向其他的服务器进行通信.以便 ...

  3. Nginx虚拟目录alias和root目录

    nginx是通过alias设置虚拟目录,在nginx的配置中,alias目录和root目录是有区别的:1)alias指定的目录是准确的,即location匹配访问的path目录下的文件直接是在alia ...

  4. 使用ViewBag传送数据从控制器至视图

    前一篇<ASP.NET MVC读取XML并使用ViewData显示>http://www.cnblogs.com/insus/p/4308740.html 中,在控制器中使用了ViewDa ...

  5. 如何把Json格式字符写进text文件中

    本篇一步一步学习怎样把显示于网页的json格式的字符串写进text文件中,并保存起来.学习到创建model, Entity, 序列化List<object>转换为json,显示于网页上.然 ...

  6. C# where用法

    where 子句用于指定类型约束,这些约束可以作为泛型声明中定义的类型参数的变量. 1.接口约束. 例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 ICompa ...

  7. Spring Security笔记:使用BCrypt算法加密存储登录密码

    在前一节使用数据库进行用户认证(form login using database)里,我们学习了如何把“登录帐号.密码”存储在db中,但是密码都是明文存储的,显然不太讲究.这一节将学习如何使用spr ...

  8. 让时间处理简单化 【第三方扩展类库org.apache.commons.lang.time】

    JAVA的时间日期处理一直是一个比较复杂的问题,大多数程序员都不能很轻松的来处理这些问题.首先Java中关于时间的类,从 JDK 1.1 开始,Date的作用很有限,相应的功能已由Calendar与D ...

  9. 三言两语聊Python模块–文档测试模块doctest

    doctest是属于测试模块里的一种,对注释文档里的示例进行检测. 给出一个例子: splitter.pydef split(line, types=None, delimiter=None): &q ...

  10. Codeforces Round #359(div 2)

    A:= v = B:^ w ^ C:一天n个小时,一个小时m分(n,m十进制),一个手表有两部分,左边表示时,右边表示分,但都是7进制,而且手表上最多只能有7个数字且数字不能重复,现在要你算出能正确表 ...