zoukankan      html  css  js  c++  java
  • 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;
    
    	@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,右边的button

    注意:凝视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) {
    		
    	}
    	/**
    	 * 返回button点击事件
    	 */
    	@Override
    	public void finishActivity() {
    		// TODO Auto-generated method stub
    		super.finishActivity();
    	}
    
    	/**
    	 * 右上角的button的点击事件
    	 */
    	@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>



    实现的界面例如以下图所看到的:




  • 相关阅读:
    2、细节&Class对象
    1、概述&应用场景
    Magento请求分发与控制器
    Magento强大的配置系统
    ecshop在PHP 5.4以上版本各种错误问题处理
    Thinkphp单字母函数使用指南
    五种常见的 PHP 设计模式
    MyISAM和InnoDB的区别
    linux下如何删除文件夹
    Linux软件安装与卸载
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7124941.html
Copyright © 2011-2022 走看看