我们在开发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();// <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>Ti tleBar用到的布局
<?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>