Android 自定义Activity基类与TitleBar

        我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字。TitleBar上的点击事件,如果给每一个Activity都写一遍TitleBar是一件非常费事的事情,这个时候我们就可以重写一个Activity基类,让其他有相同点的Activity来继承这个类,从而省去了很多的重复不必要的工作。提高了效率。

如图: 

两个界面拥有共同的特点,有一个我们自己定义的TitleBar,这个TitleBar属于我们自定义的基类BaseActivity,如果我们想让一个类具有这个特性,只需要继承BaseActivity并添加相应的布局即可。事件什么的都写一边就OK了。

  

BaseActivity.java

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

[java] view plain copy
 
  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.   
  11.     @Override  
  12.     protected void onCreate(Bundle savedInstanceState) {  
  13.         requestWindowFeature(Window.FEATURE_NO_TITLE);  
  14.         super.onCreate(savedInstanceState);  
  15.         setTheme(android.R.style.Theme_Light_NoTitleBar);  
  16.     }  
  17.   
  18.     @Override  
  19.     public void setContentView(int layoutResID) {  
  20.         // TODO Auto-generated method stub  
  21.         super.setContentView(layoutResID);  
  22.         initBaseView();  
  23.     }  
  24.   
  25.     public void initBaseView() {  
  26.         mTitleBar = (TitleBar) findViewById(R.id.base_titlebar);  
  27.     }  
  28.   
  29.     public void setTitleBarBackText(String text) {  
  30.         // mTitleBar.setBackText(text);  
  31.     }  
  32.   
  33.     public void setTitleBarTitle(String tite) {  
  34.         if (mTitleBar != null) {  
  35.             mTitleBar.setTitle(tite);  
  36.         }  
  37.     }  
  38.   
  39.     public void setTitleBarTitle(int titleId) {  
  40.         if (mTitleBar != null) {  
  41.             mTitleBar.setTitle(getString(titleId));  
  42.         }  
  43.     }  
  44.     public void setTitleBarTitleDrawable(Drawable drawable){  
  45.         if (mTitleBar != null) {  
  46.             mTitleBar.setTitleRightDrawable(drawable);  
  47.         }  
  48.     }  
  49.         //返回键事件  
  50.     public void finishActivity() {  
  51.         finish();  
  52.     }  
  53.   
  54.     public void setTitleRTBtnVisiable(int visiable) {  
  55.         if (mTitleBar != null) {  
  56.             mTitleBar.setRTBtnVisiable(visiable);  
  57.         }  
  58.   
  59.     }  
  60.   
  61.     public void setTitleRTBtnText(String text) {  
  62.         if (mTitleBar != null) {  
  63.             mTitleBar.setRTBtnText(text);  
  64.         }  
  65.     }  
  66.   
  67.     public void setTitleRTBtnText(int textId) {  
  68.         if (mTitleBar != null) {  
  69.             mTitleBar.setRTBtnText(getString(textId));  
  70.         }  
  71.     }  
  72.   
  73.     public void setTitleRTBtnFocusable(boolean focusable) {  
  74.         if (mTitleBar != null) {  
  75.             mTitleBar.setRTBtnFocusable(focusable);  
  76.         }  
  77.     }  
  78.         //中间的Title点击事件  
  79.     public void setCenterClick(boolean bool) {  
  80.         mTitleBar.setTitleClick(bool);  
  81.     }  
  82.   
  83.     public void onRtBtnClick() {  
  84.         // titlebar左上角button的click时间  
  85.     }  
  86.           
  87.     public void onCenterClick() {  
  88.         // titlebar中间的title点击事件  
  89.   
  90.     }  
  91.   
  92. }  

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

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

例如,我在点击Back的ImageView时想让Activity finished()掉,只需要我们把容器中得到的Context强转为相应的Activity即可,之后就可以方便的调用Activity的方法了。

[java] view plain copy
 
  1. /** 
  2.  * 基类BaseActivity用到的TitleBar,用来返回页面和展示当前页内容的Title信息 
  3.  *  
  4.  * @author mingwei 
  5.  *  
  6.  */  
  7. public class TitleBar extends RelativeLayout implements OnClickListener {  
  8.   
  9.     private ImageView mBack;  
  10.     private TextView mTitle;  
  11.     private TextView mRTBtn;  
  12.     BaseActivity mContext;  
  13.   
  14.     public TitleBar(Context context) {  
  15.         this(context, null);  
  16.     }  
  17.   
  18.     public TitleBar(Context context, AttributeSet attrs) {  
  19.         super(context, attrs, 0);  
  20.     }  
  21.   
  22.     public TitleBar(Context context, AttributeSet attrs, int defStyle) {  
  23.         super(context, attrs, defStyle);  
  24.         mContext = (BaseActivity) getContext();// <span style="color:#ff0000;">注释1</span>  
  25.     }  
  26.   
  27.     /** 
  28.      * 初始化控件 
  29.      */  
  30.     @Override  
  31.     protected void onFinishInflate() {  
  32.         super.onFinishInflate();  
  33.         mContext = (BaseActivity) getContext();  
  34.         mBack = (ImageView) findViewById(R.id.base_titlebar_back);  
  35.         mTitle = (TextView) findViewById(R.id.base_titlebar_title);  
  36.         mRTBtn = (TextView) findViewById(R.id.base_titlebar_rtbtn);  
  37.         mBack.setOnClickListener(this);  
  38.         mTitle.setOnClickListener(this);  
  39.         mRTBtn.setOnClickListener(this);  
  40.         mTitle.setClickable(false);  
  41.     }  
  42.   
  43.     /** 
  44.      * 右边的控件是否可见 
  45.      */  
  46.     public void setRTBtnVisiable(int visiable) {  
  47.         mRTBtn.setVisibility(visiable);  
  48.     }  
  49.   
  50.     /** 
  51.      * 右边控件的文版 
  52.      */  
  53.     public void setRTBtnText(String title) {  
  54.         mRTBtn.setText(title);  
  55.     }  
  56.   
  57.     /** 
  58.      * 右边控件的显示颜色变化 
  59.      */  
  60.     public void setRTBtnFocusable(boolean focusable) {  
  61.         mRTBtn.setEnabled(focusable);  
  62.         if (focusable) {  
  63.             mRTBtn.setTextColor(getResources().getColor(R.color.base_rtbtn_clickable_color));  
  64.         } else {  
  65.             mRTBtn.setTextColor(getResources().getColor(R.color.base_rtbtn_clickunable_color));  
  66.         }  
  67.     }  
  68.   
  69.     /** 
  70.      * 返回右边控件 
  71.      */  
  72.     public TextView getRTBtnTextView() {  
  73.         return mRTBtn;  
  74.     }  
  75.   
  76.     /** 
  77.      * 中间控件的点击事件 
  78.      */  
  79.     public void setTitleClick(boolean bool) {  
  80.         mTitle.setClickable(bool);  
  81.     }  
  82.   
  83.     /** 
  84.      * 中间控件文本</span> 
  85.      */  
  86.     public void setTitle(String title) {  
  87.         mTitle.setText(title);  
  88.     }  
  89.   
  90.     /** 
  91.      * 中间控件图标</span> 
  92.      */  
  93.     public void setCompoundDrawables(Drawable drawable) {  
  94.         mTitle.setCompoundDrawables(null, null, drawable, null);  
  95.     }  
  96.   
  97.     /** 
  98.      * 中间控件图标</span> 
  99.      */  
  100.     public void setTitleRightDrawable(Drawable drawable) {  
  101.         mTitle.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null);  
  102.     }  
  103.   
  104.     /** 
  105.      * 控件的点击情况,分别去调用BaseActivity的方法, 
  106.      * 基类被重写后将在子类中调用这些方法</span> 
  107.      */  
  108.     @Override  
  109.     public void onClick(View v) {  
  110.         switch (v.getId()) {  
  111.         case R.id.base_titlebar_back:  
  112.             mContext.finishActivity();  
  113.             break;  
  114.         case R.id.base_titlebar_title:  
  115.             mContext.onCenterClick();  
  116.             break;  
  117.         case R.id.base_titlebar_rtbtn:  
  118.             mContext.onRtBtnClick();  
  119.             break;  
  120.         default:  
  121.             break;  
  122.         }  
  123.     }  
  124. }  


[java] view plain copy
 
  1. </pre><p></p><pre>  
TitleBar用到的布局
[html] view plain copy
 
  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.   
  8.     <ImageView  
  9.         android:id="@+id/base_titlebar_back"  
  10.         android:layout_width="@dimen/base_titlebar_back_width"  
  11.         android:layout_height="match_parent"  
  12.         android:contentDescription="@string/base_title_back_des"  
  13.         android:padding="@dimen/base_activity_titlebar_back_padding"  
  14.         android:src="@drawable/base_activity_back_nor" />  
  15.   
  16.     <TextView  
  17.         android:id="@+id/base_titlebar_title"  
  18.         style="@style/BaseActivityTitlebarTitleStyle"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="match_parent"  
  21.         android:layout_alignBaseline="@+id/base_titlebar_back"  
  22.         android:layout_alignBottom="@+id/base_titlebar_back"  
  23.         android:layout_centerHorizontal="true" />  
  24.   
  25.     <TextView  
  26.         android:id="@+id/base_titlebar_rtbtn"  
  27.         android:layout_width="wrap_content"  
  28.         android:layout_height="match_parent"  
  29.         android:layout_alignParentRight="true"  
  30.         android:layout_centerVertical="true"  
  31.         android:layout_marginRight="@dimen/base_titlebar_rtbutton_marginright"  
  32.         android:gravity="center"  
  33.         android:textColor="@color/base_activity_titlebar_textcolor"  
  34.         android:visibility="invisible" />  
  35.   
  36.     <View  
  37.         android:layout_width="match_parent"  
  38.         android:layout_height="@dimen/base_titlebar_bottom_line_height"  
  39.         android:layout_alignParentBottom="true"  
  40.         android:background="@color/base_activity_titlebar_bottom_linecolor" />  
  41.   
  42. </com.xiaoda.juma001.widget.TitleBar>  

写到这里就写好了,我们来看看如何使用
[java] view plain copy
 
  1. /** 
  2.  * 继承BaseActivity 
  3.  * @author mingwei 
  4.  * 
  5.  */  
  6. public class AllPictureActivity extends BaseActivity {  
  7.       
  8.   
  9.     @Override  
  10.     protected void onCreate(Bundle savedInstanceState) {  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.allpicture_activity);  
  13.         setTitleBarTitle(R.string.allpicture_title);  
  14.         setTitleRTBtnVisiable(View.VISIBLE);  
  15.         setTitleRTBtnText(R.string.allpicture_ok);  
  16.         setTitleBarTitleDrawable(getResources().getDrawable(R.drawable.all_picture_more_dropdown));  
  17.         setCenterClick(true);  
  18.         initView();  
  19.     }  
  20.   
  21.     private void initView() {  
  22.           
  23.     }  
  24.   
  25.     /** 
  26.      * 中间的TitleBar的点击事件 
  27.      */  
  28.     @Override  
  29.     public void onCenterClick() {  
  30.         super.onCenterClick();  
  31.         taggleLayout();  
  32.     }  
  33.   
  34.     private void taggleLayout() {  
  35.           
  36.     }  
  37.   
  38.     private void changeData(int i) {  
  39.           
  40.     }  
  41.     /** 
  42.      * 返回按钮点击事件 
  43.      */  
  44.     @Override  
  45.     public void finishActivity() {  
  46.         // TODO Auto-generated method stub  
  47.         super.finishActivity();  
  48.     }  
  49.   
  50.     /** 
  51.      * 右上角的按钮的点击事件 
  52.      */  
  53.     @Override  
  54.     public void onRtBtnClick() {  
  55.         super.onRtBtnClick();  
  56.           
  57.     }  
  58.   
  59.       
  60.       
  61. }  
别忘了给Activity布局文件加上TitleBar的文件引用
[html] view plain copy
 
  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.   
  7.     <include  
  8.         android:id="@id/base_titlebar"  
  9.         layout="@layout/base_activity_titlebar" />//TitleBar布局文件  
  10.   
  11.       
  12.   
  13.         <GridView  
  14.             android:id="@+id/allpicture_grid"  
  15.             android:layout_width="match_parent"  
  16.             android:layout_height="match_parent"  
  17.             android:cacheColorHint="@android:color/transparent"  
  18.             android:columnWidth="90dip"  
  19.             android:gravity="center"  
  20.             android:horizontalSpacing="5dip"  
  21.             android:listSelector="@android:color/transparent"  
  22.             android:numColumns="auto_fit"  
  23.             android:stretchMode="columnWidth"  
  24.             android:verticalSpacing="5dip" >  
  25.         </GridView>  
  26.   
  27.           
  28.   
  29. </LinearLayout>  
ids文件 别忘了把你这些不变的id写到ids文件中去
[html] view plain copy
 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.   
  4.     <item name="base_titlebar" type="id">base_titlebar</item>  
  5.   
  6. </resources>  


实现的界面如下图所示:

原文地址:https://www.cnblogs.com/wytiger/p/5235201.html