我们在开发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>
- <?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();
- }
- }
- <?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>
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <item name="base_titlebar" type="id">base_titlebar</item>
- </resources>
实现的界面如下图所示: