我们在开发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点击事件
}
}
注意:注释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();// 注释1
}
/**
* 初始化控件
*/
@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);
}
/**
* 中间控件文本
*/
public void setTitle(String title) {
mTitle.setText(title);
}
/**
* 中间控件图标
*/
public void setCompoundDrawables(Drawable drawable) {
mTitle.setCompoundDrawables(null, null, drawable, null);
}
/**
* 中间控件图标
*/
public void setTitleRightDrawable(Drawable drawable) {
mTitle.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null);
}
/**
* 控件的点击情况,分别去调用BaseActivity的方法,
* 基类被重写后将在子类中调用这些方法
*/
@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;
}
}
}
Ti
tleBar用到的布局
/**
* 继承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();
}
}
//TitleBar布局文件
- base_titlebar