編輯:關於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點擊事件 } }
注意:注釋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
一、onWindowFocusChanged有時我們需要測量一個Activity多長時間才能顯示出來,那麼在代碼中打點計時的時機選在哪兒呢?在onCreate和onRes
首先介紹功能,我要實現動態加載布局的效果,之前是采用的new組件的辦法來實現,但是android內存有限,new的對象會達到500多個,為了減少new的對象,我決定使用x
最近一直關注一些比較有名的app,像美團、58、趕集網、淘寶等等。主要目的就是學習下目前一些常用的技術,模擬一下它們的比較炫的界面來鞏固下知識,我發現美團、5
??近段時間業余在學node.js,租了個阿裡雲准備搭建後端,想用node.js,偶爾得知react-native可以在不同平台跑,js在iOS和android上都可以運