Android 自定义Activity基类

        我们在开发App的时候有时候碰到多个界面有一个共同点的时候,比如,都有相同的TitleBar,并且TitleBar可以设置显示的文字。TitleBar上的点击事件,如果给每一个Activity都写一遍TitleBar是一件非常费事的事情,这个时候我们就可以重写一个Activity基类,让其他有相同点的Activity来继承这个类,从而省去了很多的重复不必要的工作。提高了效率。


如图: 

两个界面拥有共同的特点,有一个我们自己定义的TitleBar,这个TitleBar属于我们自定义的基类BaseActivity,如果我们想让一个类具有这个特性,只需要继承BaseActivity并添加相应的布局即可。事件什么的都写一边就OK了。

Android 自定义Activity基类_第1张图片  Android 自定义Activity基类_第2张图片


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

	
	
}


别忘了给Activity布局文件加上TitleBar的文件引用

<?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>


ids文件 别忘了把你这些不变的id写到ids文件中去

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <item name="base_titlebar" type="id">base_titlebar</item>

</resources>


实现的界面如下图所示:




你可能感兴趣的:(BaseActivity,自定义Activity)