Android 自訂Activity基類

來源:互聯網
上載者:User

Android 自訂Activity基類

我們在開發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;@Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);setTheme(android.R.style.Theme_Light_NoTitleBar);}@Overridepublic void setContentView(int layoutResID) {// TODO Auto-generated method stubsuper.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}/** * 初始化控制項 */@Overrideprotected 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的方法, * 基類被重寫後將在子類中調用這些方法 */@Overridepublic 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 {@Overrideprotected 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的點擊事件 */@Overridepublic void onCenterClick() {super.onCenterClick();taggleLayout();}private void taggleLayout() {}private void changeData(int i) {}/** * 返回按鈕點擊事件 */@Overridepublic void finishActivity() {// TODO Auto-generated method stubsuper.finishActivity();}/** * 右上方的按鈕的點擊事件 */@Overridepublic void onRtBtnClick() {super.onRtBtnClick();}}

 

 

別忘了給Activity布局檔案加上TitleBar的檔案引用

 

    //TitleBar布局檔案                            

 

 

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

 

    base_titlebar


實現的介面如所示:

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.