• 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>  


    实现的界面如下图所示:

  • 相关阅读:
    java循环控制语句loop使用
    可实现的全局唯一有序ID生成策略
    ElasticSearch使用RestHighLevelClient进行搜索查询
    基于Redis实现分布式定时任务调度
    python脚本生成exe程序
    敏捷开发--工作流程的梳理
    React-菜鸟学习笔记(二)
    React-菜鸟学习笔记(一)
    ZooKeeper-基础介绍
    常用排序算法的Java实现与分析
  • 原文地址:https://www.cnblogs.com/wytiger/p/5235201.html
Copyright © 2020-2023  润新知