Android 自定义Activity基类与TitleBar
我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字。TitleBar上的点击事件,如果给每一个Activity都写一遍TitleBar是一件非常费事的事情,这个时候我们就可以重写一个Activity基类,让其他有相同点的Activity来继承这个类,从而省去了很多的重复不必要的工作。提高了效率。
如图:
两个界面拥有共同的特点,有一个我们自己定义的TitleBar,这个TitleBar属于我们自定义的基类BaseActivity,如果我们想让一个类具有这个特性,只需要继承BaseActivity并添加相应的布局即可。事件什么的都写一边就OK了。
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,右边的按钮
注意:注释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) {
- }
- /**
- * 返回按钮点击事件
- */
- @Override
- public void finishActivity() {
- // TODO Auto-generated method stub
- super.finishActivity();
- }
- /**
- * 右上角的按钮的点击事件
- */
- @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基类与TitleBar的更多相关文章
- Android 自己定义Activity基类
我们在开发App的时候有时候碰到多个界面有一个共同点的时候.比方,都有同样的TitleBar.而且TitleBar能够设置显示的文字.TitleBar上的点击事件,假设给每个Activity都写一遍T ...
- 命令行下使用javah命令生成.h文件,出现“错误: 无法访问android.app.Activity 找不到android.app.Activity的类文件”的解决方法
在学习NDK中,当我在项目的bin/classes目录下使用javah命令生成头文件时,出现了“错误: 无法访问android.app.Activity 找不到android.app.Activity ...
- javah编译class文件找不到android.app.Activity的类文件
在android工程的根目录使用javah生成jni 头文件时候,报找不到android.app.Activity的类文件错误. 无法访问android.app.Activity是说明没有引入andr ...
- WPF自学入门(九)WPF自定义窗口基类
今天简单记录一个知识点:WPF自定义窗口基类,常用winform的人知道,winform的窗体继承是很好用的,写一个基础窗体,直接在后台代码改写继承窗体名.但如果是WPF要继承窗体,我个人感觉没有理解 ...
- WPF 之 创建继承自Window 基类的自定义窗口基类
开发项目时,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于 Window 自身的,但窗口的外边框及窗口移动.最小化等标题栏操作基本都是一样的.所以通过查看资料,可按如下方法创建继承 ...
- Android 自定义Activity的标题栏(Titlebar)
缺省的情况下,通常见到Activity的标题栏(Titlebar)是这样的(红色框内): HandleContacts是Activity的标题.有时候,我们希望能改变一下这样单调的状况.比如,要在标题 ...
- 【Android进阶】为什么要创建Activity基类以及Activity基类中一般有哪些方法
现在也算是刚刚基本完成了自己的第一个商业项目,在开发的过程中,参考了不少人的代码风格,然而随着工作经验的积累,终于开始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. ...
- 【Android先进】我们为什么要创建Activity基类Activity什么是一般的基类方法
今天,它可以被视为只是基本完成了其首个商业项目,在发展过程中,风格,然而随着工作经验的积累.最终開始慢慢的了解到抽象思想在面向对象编程中的重要性,这一篇简单的介绍一下我的一点收获. 首先,在如今的项目 ...
- Android:自定义BaseActivity基类
使用BaseActivity可以封装一些重复代码例如设置标题栏颜色,封装一些工具类... 主要功能: 封装Toast 新建一个BaseActivity继承自Activity package com.o ...
随机推荐
- Unity3D中的预制件(Prefab)的创建和使用说明!!!
首先我说明一下什么预制件? 在U3D里面我们叫它Prefab:我们可以这样理解:当制作好了游戏组件(场景中的任意一个gameobject),我们希望将它制作成一个组件模版,用于批量的套用工作,例如说场 ...
- 那些年我们用到的jquery选择器!!
一:基本选择器 1:标签选择器: 返回值(元素集合):$("h2")选取所有h2元素. 2:类选择器:返回值(元素集合):$(".title")选取所有clas ...
- [No000055]教你早晨清肠、除口臭、色斑、大肚腩
[长生不老的秘诀] 释.道.医三家有个共同的秘诀:"要叫人不死. 肠中须无屎". 佛家除要求人们戒杀吃素外,还认为早饭是天食,中饭是人食,晚饭是鬼食. 因此,为了身体健康,不妨碍修 ...
- java 26 - 8 网络编程之 TCP协议的练习
TCP练习: 1.客户端键盘录入,服务器输出文本文件 客户端代码: public class ClientDemo { public static void main(String[] args) t ...
- 小Y的棋盘问题 题解
有一个n*m的棋盘,上面有一些棋子,每行每列最多只会有一个棋子,不会有两个棋子八连通.问随机一个空格子作为起点,再随机地选择一个空格子作为终点,求问不经过任意棋子最短路的期望长度是多少.多组,n,m& ...
- Java daemon thread 守护线程
守护线程与普通线程写法上基本么啥区别,在启动线程前, 调用线程对象的方法setDaemon(true),则可以将其设置为守护线程. 守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收.内存 ...
- mybatis 3.2.8 + log4j2.0.2 控制台输出sql语句
mybatis3.2.7有一个bug,使用log4j2 (2.0.2)版本时,会找不到类 ,导致启动失败,详见 https://github.com/mybatis/mybatis-3/issues/ ...
- C# 7.0 新特性2: 本地方法
本文参考Roslyn项目中的Issue:#259. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- 使用pngquant来压缩png资源缩小apk
最近发现了一个叫做pngquant的工具,可以有效的压缩资源文件中的png文件,从而减小发布的apk的大小.我发现这个工具有两个特点: 1. 真无损,压缩后重新运行了我的app发现是没有任何区别的 2 ...
- 仿各种APP将文章DOM转JSON并在APP中以列表显示(android、ios、php已开源)
背景 一直以来都想实现类似新闻客户端.鲜城等文章型app的正文显示,即在web editor下编辑后存为json,在app中解析json并显示正文. 网上搜过,没找到轮子.都是给的思路,然后告知是公司 ...