我們在開發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>
TitleBar用到的佈局
<?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>
實現的界面如下圖所示: