Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 自定義Activity基類

Android 自定義Activity基類

編輯:關於Android編程

我們在開發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();// 注釋1
	}

	/**
	 * 初始化控件
	 */
	@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);
	}

	/**
	 * 中間控件文本
	 */
	public void setTitle(String title) {
		mTitle.setText(title);
	}

	/**
	 * 中間控件圖標
	 */
	public void setCompoundDrawables(Drawable drawable) {
		mTitle.setCompoundDrawables(null, null, drawable, null);
	}

	/**
	 * 中間控件圖標
	 */
	public void setTitleRightDrawable(Drawable drawable) {
		mTitle.setCompoundDrawablesWithIntrinsicBounds(null, null, drawable, null);
	}

	/**
	 * 控件的點擊情況,分別去調用BaseActivity的方法,
	 * 基類被重寫後將在子類中調用這些方法
	 */
	@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;
		}
	}
}


 

 


 


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();
		
	}

	
	
}

 

 

別忘了給Activity布局文件加上TitleBar的文件引用

 




    //TitleBar布局文件

    

        
        

        

 

 

ids文件 別忘了把你這些不變的id寫到ids文件中去

 




    base_titlebar



實現的界面如下圖所示:

 

\

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved