我们在开发App的时候有时候碰到多个界面有一个共同点的时候。比方,都有同样的TitleBar。而且TitleBar能够设置显示的文字。TitleBar上的点击事件,假设给每个Activity都写一遍TitleBar是一件非常费事的事情,这个时候我们就能够重写一个Activity基类,让其它有同样点的Activity来继承这个类。从而省去了非常多的反复不必要的工作。

提高了效率。

如图:

两个界面拥有共同的特点,有一个我们自定义的TitleBar,这个TitleBar属于我们自定义的基类BaseActivity,假设我们想让一个类具有这个特性,仅仅须要继承BaseActivity并加入对应的布局就可以。事件什么的都写一边就OK了。

  

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="320" height="600" alt="">

BaseActivity.java

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

/**
* 重写的一个Activity 的基类,在基类中实现了一个TitleBar 用TitleBar来展示一个标题
* 同一时候定义一个Back按钮,点击的时候退出当前的Activity
*
* @author mingwei
*
*/
public abstract class BaseActivity extends Activity {
private TitleBar mTitleBar; @Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setTheme(android.R.style.Theme_Light_NoTitleBar);
} @Override
public void setContentView(int layoutResID) {
// TODO Auto-generated method stub
super.setContentView(layoutResID);
initBaseView();
} public void initBaseView() {
mTitleBar = (TitleBar) findViewById(R.id.base_titlebar);
} public void setTitleBarBackText(String text) {
// mTitleBar.setBackText(text);
} public void setTitleBarTitle(String tite) {
if (mTitleBar != null) {
mTitleBar.setTitle(tite);
}
} public void setTitleBarTitle(int titleId) {
if (mTitleBar != null) {
mTitleBar.setTitle(getString(titleId));
}
}
public void setTitleBarTitleDrawable(Drawable drawable){
if (mTitleBar != null) {
mTitleBar.setTitleRightDrawable(drawable);
}
}
//返回键事件
public void finishActivity() {
finish();
} public void setTitleRTBtnVisiable(int visiable) {
if (mTitleBar != null) {
mTitleBar.setRTBtnVisiable(visiable);
} } public void setTitleRTBtnText(String text) {
if (mTitleBar != null) {
mTitleBar.setRTBtnText(text);
}
} public void setTitleRTBtnText(int textId) {
if (mTitleBar != null) {
mTitleBar.setRTBtnText(getString(textId));
}
} public void setTitleRTBtnFocusable(boolean focusable) {
if (mTitleBar != null) {
mTitleBar.setRTBtnFocusable(focusable);
}
}
//中间的Title点击事件
public void setCenterClick(boolean bool) {
mTitleBar.setTitleClick(bool);
} public void onRtBtnClick() {
// titlebar左上角button的click时间
} public void onCenterClick() {
// titlebar中间的title点击事件 } }

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

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

比如,我在点击Back的ImageView时想让Activity finished()掉,仅仅须要我们把容器中得到的Context强转为对应的Activity就可以,之后就能够方便的调用Activity的方法了。

/**
* 基类BaseActivity用到的TitleBar。用来返回页面和展示当前页内容的Title信息
*
* @author mingwei
*
*/
public class TitleBar extends RelativeLayout implements OnClickListener { private ImageView mBack;
private TextView mTitle;
private TextView mRTBtn;
BaseActivity mContext; public TitleBar(Context context) {
this(context, null);
} public TitleBar(Context context, AttributeSet attrs) {
super(context, attrs, 0);
} public TitleBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = (BaseActivity) getContext();// <span style="color:#ff0000;">凝视1</span>
} /**
* 初始化控件
*/
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mContext = (BaseActivity) getContext();
mBack = (ImageView) findViewById(R.id.base_titlebar_back);
mTitle = (TextView) findViewById(R.id.base_titlebar_title);
mRTBtn = (TextView) findViewById(R.id.base_titlebar_rtbtn);
mBack.setOnClickListener(this);
mTitle.setOnClickListener(this);
mRTBtn.setOnClickListener(this);
mTitle.setClickable(false);
} /**
* 右边的控件是否可见
*/
public void setRTBtnVisiable(int visiable) {
mRTBtn.setVisibility(visiable);
} /**
* 右边控件的文版
*/
public void setRTBtnText(String title) {
mRTBtn.setText(title);
} /**
* 右边控件的显示颜色变化
*/
public void setRTBtnFocusable(boolean focusable) {
mRTBtn.setEnabled(focusable);
if (focusable) {
mRTBtn.setTextColor(getResources().getColor(R.color.base_rtbtn_clickable_color));
} else {
mRTBtn.setTextColor(getResources().getColor(R.color.base_rtbtn_clickunable_color));
}
} /**
* 返回右边控件
*/
public TextView getRTBtnTextView() {
return mRTBtn;
} /**
* 中间控件的点击事件
*/
public void setTitleClick(boolean bool) {
mTitle.setClickable(bool);
} /**
* 中间控件文本</span>
*/
public void setTitle(String title) {
mTitle.setText(title);
} /**
* 中间控件图标</span>
*/
public void setCompoundDrawables(Drawable drawable) {
mTitle.setCompoundDrawables(null, null, drawable, null);
} /**
* 中间控件图标</span>
*/
public void setTitleRightDrawable(Drawable drawable) {
mTitle.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null);
} /**
* 控件的点击情况,分别去调用BaseActivity的方法,
* 基类被重写后将在子类中调用这些方法</span>
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.base_titlebar_back:
mContext.finishActivity();
break;
case R.id.base_titlebar_title:
mContext.onCenterClick();
break;
case R.id.base_titlebar_rtbtn:
mContext.onRtBtnClick();
break;
default:
break;
}
}
}

</pre><p></p><pre>

TitleBar用到的布局

<?xml version="1.0" encoding="utf-8"?>
<com.xiaoda.juma001.widget.TitleBar xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/base_titlebar_height"
android:background="@color/base_activity_titlebar_backcolor"
android:fitsSystemWindows="true" > <ImageView
android:id="@+id/base_titlebar_back"
android:layout_width="@dimen/base_titlebar_back_width"
android:layout_height="match_parent"
android:contentDescription="@string/base_title_back_des"
android:padding="@dimen/base_activity_titlebar_back_padding"
android:src="@drawable/base_activity_back_nor" /> <TextView
android:id="@+id/base_titlebar_title"
style="@style/BaseActivityTitlebarTitleStyle"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignBaseline="@+id/base_titlebar_back"
android:layout_alignBottom="@+id/base_titlebar_back"
android:layout_centerHorizontal="true" /> <TextView
android:id="@+id/base_titlebar_rtbtn"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="@dimen/base_titlebar_rtbutton_marginright"
android:gravity="center"
android:textColor="@color/base_activity_titlebar_textcolor"
android:visibility="invisible" /> <View
android:layout_width="match_parent"
android:layout_height="@dimen/base_titlebar_bottom_line_height"
android:layout_alignParentBottom="true"
android:background="@color/base_activity_titlebar_bottom_linecolor" /> </com.xiaoda.juma001.widget.TitleBar>

写到这里就写好了。我们来看看怎样使用

/**
* 继承BaseActivity
* @author mingwei
*
*/
public class AllPictureActivity extends BaseActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.allpicture_activity);
setTitleBarTitle(R.string.allpicture_title);
setTitleRTBtnVisiable(View.VISIBLE);
setTitleRTBtnText(R.string.allpicture_ok);
setTitleBarTitleDrawable(getResources().getDrawable(R.drawable.all_picture_more_dropdown));
setCenterClick(true);
initView();
} private void initView() { } /**
* 中间的TitleBar的点击事件
*/
@Override
public void onCenterClick() {
super.onCenterClick();
taggleLayout();
} private void taggleLayout() { } private void changeData(int i) { }
/**
* 返回button点击事件
*/
@Override
public void finishActivity() {
// TODO Auto-generated method stub
super.finishActivity();
} /**
* 右上角的button的点击事件
*/
@Override
public void onRtBtnClick() {
super.onRtBtnClick(); } }

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <include
android:id="@id/base_titlebar"
layout="@layout/base_activity_titlebar" />//TitleBar布局文件 <GridView
android:id="@+id/allpicture_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:cacheColorHint="@android:color/transparent"
android:columnWidth="90dip"
android:gravity="center"
android:horizontalSpacing="5dip"
android:listSelector="@android:color/transparent"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="5dip" >
</GridView> </LinearLayout>

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

<?

xml version="1.0" encoding="utf-8"?>
<resources> <item name="base_titlebar" type="id">base_titlebar</item> </resources>

实现的界面例如以下图所看到的:

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

  1. Android 自定义Activity基类与TitleBar

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

  2. 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception

    异常体系结构 概念 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类. 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Erro ...

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

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

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

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

  5. asp.net 的page 基类页面 做一些判断 可以定义一个基类页面 继承Page类 然后重写OnPreLoad事件

    public class BasePage:Page protected override void OnPreLoad(EventArgs e){     base.OnPreLoad(e);    ...

  6. 在对Activity基类的封装中,我做了什么

    在开发实践中,不同Activity有很多代码是反复冗余的.因此非常有必要将这部分抽取出来.封装一个继承自Activity的类,命名为BaseActivity. 翻看之前写过的代码,起初,BaseAct ...

  7. android Activity基类通用方法

    public class BaseActivity extends Activity { Resources res; // 通用资源缩写 @Override protected void onCre ...

  8. Android:自定义BaseActivity基类

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

  9. Android 在非Activity的类中调用startActivityForResult

    http://www.360doc.com/content/11/0720/10/7322578_134657348.shtml

随机推荐

  1. Farseer.net轻量级开源框架 入门篇:删除数据详解

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 下一篇:Farseer.net轻量级开源框架 入门篇: 查询数据详解 ...

  2. Ngnix SSL配置(HTTP、HTTPS兼容)

    一.使用阿里云提供证书 下载aliyun证书for Nginx,解压出两个文件,.pem和.key文件 在nginx安装目录Conf文件夹下新建cert文件夹,拷贝两个密钥文件 二.配置nginx 打 ...

  3. java基础学习之垃圾回收机制

    回收过程: 1.发现无用的对象 2.回收无用对象占用的内存的空间. 垃圾回收相关算法: 1.引用计数法 堆中每个对象都有一个引用计数.被引用一次,计数加一.被引用变量值变为null,则计数减一. 到计 ...

  4. php利用array_filter()过滤数组空值

    利用array_filter过滤数组空值 <?php $array = array( 0 => '霜天部落', 1 => false, 2 => 1, 3 => null ...

  5. Robot Framework(九) 执行测试用例——基本用法

    3.1基本用法 Robot Framework测试用例从命令行执行,默认情况下,最终结果是XML格式的输出文件和HTML 报告和日志.执行后,可以组合输出文件,然后使用rebot工具进行后处理. 3. ...

  6. 【Redis】三、Redis安装及简单示例

    (四)Redis安装及使用   Redis的安装比较简单,仍然和大多数的Apache开源软件一样,只需要下载,解压,配置环境变量即可.具体安装过程参考:菜鸟教程Redis安装.   安装完成后,通过r ...

  7. notepad++使用NppFTP连接linux,编写shell脚本无法保存上传的问题

    下载安装NppFTP插件之后,重启打开notepad++连接到linux主机,之后进行编辑shell脚本,出现无法保存上传至linux主机的问题. 分析的原因:可能的原因是Windows防火墙阻止了应 ...

  8. pageContext对象的使用及常用方法

    pageContext对象的使用及常用方法 制作人:全心全意 获取页面上下文的pageContext对象是一个比较特殊的对象,通过它可以获取JSP页面的request.response.session ...

  9. buf.writeInt16BE()函数详解

    buf.writeInt16BE(value, offset[, noAssert]) buf.writeInt16LE(value, offset[, noAssert]) value {Numbe ...

  10. 在 Oculus和 Gear VR上开发跨平台的 VR应用

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51433994 作者:car ...