千里之行,始于足下(二)-------创建基类

来源:互联网 发布:西安白队长 知乎 编辑:程序博客网 时间:2024/04/28 09:30

前一篇我们已经把jar包导入项目,并配置好项目文件。今天我们就把基础框架搭一下,之后所有的Activity类都将继承这些基类。
1、BaseActivity,继承Activity。所有Activity的基类。

package com.mtwy.tracksite.activity;import java.util.List;import android.app.Activity;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.text.TextUtils;import android.util.DisplayMetrics;import android.util.Log;import android.widget.Toast;import cn.bmob.im.BmobChatManager;import cn.bmob.im.BmobUserManager;import cn.bmob.im.bean.BmobChatUser;import cn.bmob.im.config.BmobConfig;import cn.bmob.v3.listener.FindListener;import cn.bmob.v3.listener.UpdateListener;import com.mtwy.tracksite.activity.bmob.LoginActivity;import com.mtwy.tracksite.application.MyApplication;import com.mtwy.tracksite.bean.User;import com.mtwy.tracksite.dialog.DialogTips;import com.mtwy.tracksite.util.CollectionUtils;/** * 所有Activty的基类 *  * @author Administrator *  */public class BaseActivity extends Activity {    protected BmobUserManager userManager;    protected BmobChatManager manager;    protected MyApplication mApplication;    protected int mScreenWidth;    protected int mScreenHeight;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        // 用户管理类--所有和用户有关的操作均使用此类:        // 登陆、退出、获取好友列表、获取当前登陆用户、删除好友、添加好友等        userManager = BmobUserManager.getInstance(this);        // 聊天管理-用于管理聊天:包括发送(聊天消息、Tag消息)、保存消息、绑定用户等        manager = BmobChatManager.getInstance(this);        //自定义application        mApplication = MyApplication.getInstance();        //获取屏幕高宽        DisplayMetrics metric = new DisplayMetrics();        getWindowManager().getDefaultDisplay().getMetrics(metric);        mScreenWidth = metric.widthPixels;        mScreenHeight = metric.heightPixels;    }    Toast mToast;    /** 显示Toast */    public void ShowToast(final String text) {        if (!TextUtils.isEmpty(text)) {            runOnUiThread(new Runnable() {                @Override                public void run() {                    // TODO Auto-generated method stub                    if (mToast == null) {                        mToast = Toast.makeText(getApplicationContext(), text,                                Toast.LENGTH_LONG);                    } else {                        mToast.setText(text);                    }                    mToast.show();                }            });        }    }    /** 显示Toast */    public void ShowToast(final int resId) {        runOnUiThread(new Runnable() {            @Override            public void run() {                // TODO Auto-generated method stub                if (mToast == null) {                    mToast = Toast.makeText(                            BaseActivity.this.getApplicationContext(), resId,                            Toast.LENGTH_LONG);                } else {                    mToast.setText(resId);                }                mToast.show();            }        });    }    /**     * 打Log ShowLog     *      * @return void     * @throws     */    public void ShowLog(String msg) {        Log.i("life", msg);    }    public void startAnimActivity(Class<?> cla) {        this.startActivity(new Intent(this, cla));    }    public void startAnimActivity(Intent intent) {        this.startActivity(intent);    }    /**     * 显示下线的对话框 showOfflineDialog     *      * @return void     * @throws     */    public void showOfflineDialog(final Context context) {        DialogTips dialog = new DialogTips(this, "您的账号已在其他设备上登录!", "重新登录");        // 设置成功事件        dialog.SetOnSuccessListener(new DialogInterface.OnClickListener() {            public void onClick(DialogInterface dialogInterface, int userId) {                MyApplication.getInstance().logout();                startActivity(new Intent(context, LoginActivity.class));                finish();                dialogInterface.dismiss();            }        });        // 显示确认对话框        dialog.show();        dialog = null;    }    /**     * 用于登陆或者自动登陆情况下的用户资料及好友资料的检测更新     *      * @Title: updateUserInfos     * @Description: TODO     * @param     * @return void     * @throws     */    public void updateUserInfos() {        // 更新地理位置信息        updateUserLocation();        // 查询该用户的好友列表(这个好友列表是去除黑名单用户的哦),目前支持的查询好友个数为100,如需修改请在调用这个方法前设置BmobConfig.LIMIT_CONTACTS即可。        // 这里默认采取的是登陆成功之后即将好于列表存储到数据库中,并更新到当前内存中,        userManager.queryCurrentContactList(new FindListener<BmobChatUser>() {            @Override            public void onError(int arg0, String arg1) {                // TODO Auto-generated method stub                if (arg0 == BmobConfig.CODE_COMMON_NONE) {                    ShowLog(arg1);                } else {                    ShowLog("查询好友列表失败:" + arg1);                }            }            @Override            public void onSuccess(List<BmobChatUser> arg0) {                // TODO Auto-generated method stub                // 保存到application中方便比较                MyApplication.getInstance().setContactList(                        CollectionUtils.list2map(arg0));            }        });    }    /**     * 更新用户的经纬度信息     *      * @Title: uploadLocation     * @Description: TODO     * @param     * @return void     * @throws     */    public void updateUserLocation() {        if (MyApplication.lastPoint != null) {            String saveLatitude = mApplication.getLatitude();            String saveLongtitude = mApplication.getLongtitude();            String newLat = String.valueOf(MyApplication.lastPoint                    .getLatitude());            String newLong = String.valueOf(MyApplication.lastPoint                    .getLongitude());            // ShowLog("saveLatitude ="+saveLatitude+",saveLongtitude = "+saveLongtitude);            // ShowLog("newLat ="+newLat+",newLong = "+newLong);            if (!saveLatitude.equals(newLat) || !saveLongtitude.equals(newLong)) {// 只有位置有变化就更新当前位置,达到实时更新的目的                //获取当前登录的用户                User u = (User) userManager.getCurrentUser(User.class);                final User user = new User();                user.setLocation(MyApplication.lastPoint);                user.setObjectId(u.getObjectId());                //更新用户信息                user.update(this, new UpdateListener() {                    @Override                    public void onSuccess() {                        // TODO Auto-generated method stub                        MyApplication.getInstance()                                .setLatitude(                                        String.valueOf(user.getLocation()                                                .getLatitude()));                        MyApplication.getInstance().setLongtitude(                                String.valueOf(user.getLocation()                                        .getLongitude()));                        // ShowLog("经纬度更新成功");                    }                    @Override                    public void onFailure(int code, String msg) {                        // TODO Auto-generated method stub                        // ShowLog("经纬度更新 失败:"+msg);                    }                });            } else {                // ShowLog("用户位置未发生过变化");            }        }    }}

2、BaseBarActivity,继承BaseActivity。所有带标题栏的基类。

package com.mtwy.tracksite.activity;import android.app.Activity;import android.content.Intent;import android.view.WindowManager;import android.view.inputmethod.InputMethodManager;import com.mtwy.tracksite.myview.HeaderLayout;import com.mtwy.tracksite.myview.HeaderLayout.HeaderStyle;import com.mtwy.tracksite.myview.HeaderLayout.OnDriveImageButtonClickListener;import com.mtwy.tracksite.myview.HeaderLayout.OnTransitImageButtonClickListener;import com.mtwy.tracksite.myview.HeaderLayout.OnWalkImageButtonClickListener;import com.mtwy.tracksite.myview.HeaderLayout.onLeftImageButtonClickListener;import com.mtwy.tracksite.myview.HeaderLayout.onRightImageButtonClickListener;public class BaseBarActivity extends BaseActivity {    protected HeaderLayout mHeaderLayout;    /**     * 只有title initTopBarLayoutByTitle     *      * @Title: initTopBarLayoutByTitle     * @throws     */    public void initTopBarForOnlyTitle(String titleName) {        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);        mHeaderLayout.init(HeaderStyle.DEFAULT_TITLE);        mHeaderLayout.setDefaultTitle(titleName);    }    /**     * 只有标题和右侧按钮     *      * @param titleName     * @param rightDrawableId     * @param listener     */    public void initTopBarForRight(String titleName, int rightDrawableId,            onRightImageButtonClickListener listener) {        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);        mHeaderLayout.init(HeaderStyle.TITLE_RIGHT_IMAGEBUTTON);        // mHeaderLayout.setTitleAndLeftImageButton(titleName,        // R.drawable.base_action_bar_back_bg_selector,        // new OnLeftButtonClickListener());        mHeaderLayout.setTitleAndRightImageButton(titleName, rightDrawableId,                listener);    }    /**     * 初始化标题栏-带左右按钮     *      * @return void     * @throws     */    public void initTopBarForBoth(String titleName, int rightDrawableId,            String text, onRightImageButtonClickListener listener) {        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);        mHeaderLayout.init(HeaderStyle.TITLE_DOUBLE_IMAGEBUTTON);        mHeaderLayout.setTitleAndLeftImageButton(titleName,                R.drawable.base_action_bar_back_bg_selector,                new OnLeftButtonClickListener());        mHeaderLayout.setTitleAndRightButton(titleName, rightDrawableId, text,                listener);    }    public void initTopBarForBoth(String titleName, int rightDrawableId,            onRightImageButtonClickListener listener) {        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);        mHeaderLayout.init(HeaderStyle.TITLE_DOUBLE_IMAGEBUTTON);        mHeaderLayout.setTitleAndLeftImageButton(titleName,                R.drawable.base_action_bar_back_bg_selector,                new OnLeftButtonClickListener());        mHeaderLayout.setTitleAndRightImageButton(titleName, rightDrawableId,                listener);    }    public void initTopBarForRoute(onRightImageButtonClickListener listener,            OnTransitImageButtonClickListener tListener,            OnDriveImageButtonClickListener dListener,            OnWalkImageButtonClickListener wListener) {        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);        mHeaderLayout.init(HeaderStyle.TITLE_MAP_ROUTE_PLAN);        // 左侧按钮        mHeaderLayout.setTitleAndLeftImageButton("",                R.drawable.base_action_bar_back_bg_selector,                new OnLeftButtonClickListener());        // 右侧按钮        mHeaderLayout.setTitleAndRightImageButton("",                R.drawable.base_action_bar_search_bg_selector, listener);        mHeaderLayout.setOnTransitImageButtonClickListener(tListener);        mHeaderLayout.setOnDriveImageButtonClickListener(dListener);        mHeaderLayout.setOnWalkImageButtonClickListener(wListener);    }    /**     * 只有左边按钮和Title initTopBarLayout     * @param titleName     */    public void initTopBarForLeft(String titleName) {        mHeaderLayout = (HeaderLayout) findViewById(R.id.common_actionbar);        mHeaderLayout.init(HeaderStyle.TITLE_LIFT_IMAGEBUTTON);        mHeaderLayout.setTitleAndLeftImageButton(titleName,                R.drawable.base_action_bar_back_bg_selector,                new OnLeftButtonClickListener());    }    // 左边按钮的点击事件    public class OnLeftButtonClickListener implements            onLeftImageButtonClickListener {        @Override        public void onClick() {            finish();        }    }    /** 跳转Activity */    public void startAnimActivity(Class<?> cla) {        this.startActivity(new Intent(this, cla));    }    /** 跳转Activity */    public void startAnimActivity(Intent intent) {        this.startActivity(intent);    }    /**     * 隐藏软键盘 hideSoftInputView     *      * @Title: hideSoftInputView     * @Description: TODO     * @param     * @return void     * @throws     */    public void hideSoftInputView() {        InputMethodManager manager = ((InputMethodManager) this                .getSystemService(Activity.INPUT_METHOD_SERVICE));        if (getWindow().getAttributes().softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) {            if (getCurrentFocus() != null)                manager.hideSoftInputFromWindow(getCurrentFocus()                        .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);        }    }}

在BaseBarActivity类中用到了一个自定义标题栏布局,代码如下

package com.mtwy.tracksite.myview;import android.annotation.SuppressLint;import android.content.Context;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.Button;import android.widget.ImageButton;import android.widget.LinearLayout;import android.widget.TextView;import com.mtwy.tracksite.activity.R;import com.mtwy.tracksite.util.PixelUtil;/** * 自定义头部布局 *  * @ClassName: HeaderLayout * @Description: TODO * @author smile * @date 2014-5-19 下午2:30:30 */@SuppressLint("InflateParams")public class HeaderLayout extends LinearLayout {    private LayoutInflater mInflater;    private View mHeader;    private LinearLayout mLayoutLeftContainer;    private LinearLayout mLayoutRightContainer;    private TextView mHtvSubTitle;    private LinearLayout mLayoutRightImageButtonLayout;    private Button mRightImageButton;    private onRightImageButtonClickListener mRightImageButtonClickListener;    private LinearLayout mLayoutLeftImageButtonLayout;    private ImageButton mLeftImageButton;    private onLeftImageButtonClickListener mLeftImageButtonClickListener;    private LinearLayout mLayoutMiddleContainer;    private OnTransitImageButtonClickListener mOnTransitImageButtonClickListener;    private OnDriveImageButtonClickListener mOnDriveImageButtonClickListener;    private OnWalkImageButtonClickListener mOnWalkImageButtonClickListener;    private ImageButton mTransitImageButton, mDriverImageButton,            mWalkImageButton;    public enum HeaderStyle {// 头部整体样式        TITLE_MAP_ROUTE_PLAN, // 地图路线头部样式        DEFAULT_TITLE, TITLE_LIFT_IMAGEBUTTON, TITLE_RIGHT_IMAGEBUTTON, TITLE_DOUBLE_IMAGEBUTTON;    }    public HeaderLayout(Context context) {        super(context);        init(context);    }    public HeaderLayout(Context context, AttributeSet attrs) {        super(context, attrs);        init(context);    }    /**初始化*/    public void init(Context context) {        mInflater = LayoutInflater.from(context);        mHeader = mInflater.inflate(R.layout.common_header, null);        addView(mHeader);        initViews();    }    public void initViews() {        mLayoutLeftContainer = (LinearLayout) findViewByHeaderId(R.id.header_layout_leftview_container);        mLayoutMiddleContainer = (LinearLayout) findViewByHeaderId(R.id.header_layout_middleview_container);// 中间部分添加搜索或者其他按钮时可打开        mLayoutRightContainer = (LinearLayout) findViewByHeaderId(R.id.header_layout_rightview_container);        mHtvSubTitle = (TextView) findViewByHeaderId(R.id.header_htv_subtitle);    }    public View findViewByHeaderId(int id) {        return mHeader.findViewById(id);    }    public void init(HeaderStyle hStyle) {        switch (hStyle) {        case DEFAULT_TITLE:            defaultTitle();            break;        case TITLE_LIFT_IMAGEBUTTON:            defaultTitle();            titleLeftImageButton();            break;        case TITLE_RIGHT_IMAGEBUTTON:            defaultTitle();            titleRightImageButton();            break;        case TITLE_DOUBLE_IMAGEBUTTON:            defaultTitle();            titleLeftImageButton();            titleRightImageButton();            break;        case TITLE_MAP_ROUTE_PLAN:            defaultTitle();            titleLeftImageButton();            titleMiddleImageButton();            titleRightImageButton();            break;        }    }    /**设置中间布局内容*/    private void titleMiddleImageButton() {        View mMiddleImageButtonView = mInflater.inflate(                R.layout.common_header_middle, null);        mLayoutMiddleContainer.addView(mMiddleImageButtonView);        mTransitImageButton = (ImageButton) mMiddleImageButtonView                .findViewById(R.id.header_middle_transitimagebutton);        mDriverImageButton = (ImageButton) mMiddleImageButtonView                .findViewById(R.id.header_middle_driverimagebutton);        mWalkImageButton = (ImageButton) mMiddleImageButtonView                .findViewById(R.id.header_middle_walkimagebutton);        mTransitImageButton.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                if(mOnTransitImageButtonClickListener != null){                    mOnTransitImageButtonClickListener.onClick();                }            }        });        mDriverImageButton.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                if(mOnDriveImageButtonClickListener != null){                    mOnDriveImageButtonClickListener.onClick();                }            }        });        mWalkImageButton.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                if(mOnWalkImageButtonClickListener != null){                    mOnWalkImageButtonClickListener.onClick();                }            }        });    }    // 默认文字标题    private void defaultTitle() {        mLayoutLeftContainer.removeAllViews();        mLayoutRightContainer.removeAllViews();    }    // 左侧自定义按钮    private void titleLeftImageButton() {        View mleftImageButtonView = mInflater.inflate(                R.layout.common_header_button, null);        mLayoutLeftContainer.addView(mleftImageButtonView);        mLayoutLeftImageButtonLayout = (LinearLayout) mleftImageButtonView                .findViewById(R.id.header_layout_middlelayout);        mLeftImageButton = (ImageButton) mleftImageButtonView                .findViewById(R.id.header_middle_leftimagebutton);        mLayoutLeftImageButtonLayout.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                if (mLeftImageButtonClickListener != null) {                    mLeftImageButtonClickListener.onClick();                }            }        });    }    // 右侧自定义按钮    private void titleRightImageButton() {        View mRightImageButtonView = mInflater.inflate(                R.layout.common_header_rightbutton, null);        mLayoutRightContainer.addView(mRightImageButtonView);        mLayoutRightImageButtonLayout = (LinearLayout) mRightImageButtonView                .findViewById(R.id.header_layout_middlelayout);        mRightImageButton = (Button) mRightImageButtonView                .findViewById(R.id.header_middle_leftimagebutton);        mLayoutRightImageButtonLayout.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View arg0) {                if (mRightImageButtonClickListener != null) {                    mRightImageButtonClickListener.onClick();                }            }        });    }    /**     * 获取右边按钮     *      * @Title: getRightImageButton     * @Description: TODO     * @param @return     * @return Button     * @throws     */    public Button getRightImageButton() {        if (mRightImageButton != null) {            return mRightImageButton;        }        return null;    }    /**设置标题*/    public void setDefaultTitle(CharSequence title) {        if (title != null) {            mHtvSubTitle.setText(title);        } else {            mHtvSubTitle.setVisibility(View.GONE);        }    }    /**设置标题与右侧带文字按钮*/    public void setTitleAndRightButton(CharSequence title, int backid,            String text,            onRightImageButtonClickListener onRightImageButtonClickListener) {        setDefaultTitle(title);        mLayoutRightContainer.setVisibility(View.VISIBLE);        if (mRightImageButton != null && backid > 0) {            mRightImageButton.setWidth(PixelUtil.dp2px(45));            mRightImageButton.setHeight(PixelUtil.dp2px(40));            mRightImageButton.setBackgroundResource(backid);            mRightImageButton.setText(text);            setOnRightImageButtonClickListener(onRightImageButtonClickListener);        }    }    /**设置标题与右侧图片按钮*/    public void setTitleAndRightImageButton(CharSequence title, int backid,            onRightImageButtonClickListener onRightImageButtonClickListener) {        setDefaultTitle(title);        mLayoutRightContainer.setVisibility(View.VISIBLE);        if (mRightImageButton != null && backid > 0) {            mRightImageButton.setWidth(PixelUtil.dp2px(30));            mRightImageButton.setHeight(PixelUtil.dp2px(30));            mRightImageButton.setTextColor(getResources().getColor(                    R.color.transparent));            mRightImageButton.setBackgroundResource(backid);            setOnRightImageButtonClickListener(onRightImageButtonClickListener);        }    }    /**设置标题与左侧按钮*/    public void setTitleAndLeftImageButton(CharSequence title, int id,            onLeftImageButtonClickListener listener) {        setDefaultTitle(title);        if (mLeftImageButton != null && id > 0) {            mLeftImageButton.setImageResource(id);            setOnLeftImageButtonClickListener(listener);        }        mLayoutRightContainer.setVisibility(View.INVISIBLE);    }    /**设置地图路线按钮*/    public void setRouteImageButton(){        setDefaultTitle(null);        if (mTransitImageButton != null) {            mRightImageButton.setBackgroundResource(R.drawable.button_transit);        }        if (mDriverImageButton != null) {            mDriverImageButton.setBackgroundResource(R.drawable.button_driver);        }        if (mWalkImageButton != null) {            mWalkImageButton.setBackgroundResource(R.drawable.button_walk);        }    }    /**设置右侧按钮点击事件*/    public void setOnRightImageButtonClickListener(            onRightImageButtonClickListener listener) {        mRightImageButtonClickListener = listener;    }    /**右侧按钮点击事件接口*/    public interface onRightImageButtonClickListener {        void onClick();    }    public void setOnLeftImageButtonClickListener(            onLeftImageButtonClickListener listener) {        mLeftImageButtonClickListener = listener;    }    /**左侧按钮点击事件接口*/    public interface onLeftImageButtonClickListener {        void onClick();    }    /**公交路线按钮接口*/    public interface OnTransitImageButtonClickListener {        public void onClick();    }    /**自驾路线按钮接口*/    public interface OnDriveImageButtonClickListener {        public void onClick();    }    /**步行路线按钮接口*/    public interface OnWalkImageButtonClickListener {        public void onClick();    }    /**设置公交路线按钮点击事件*/    public void setOnTransitImageButtonClickListener(            OnTransitImageButtonClickListener onTransitImageButtonClickListener) {        mOnTransitImageButtonClickListener = onTransitImageButtonClickListener;    }    /**设置自驾路线按钮点击事件*/    public void setOnDriveImageButtonClickListener(            OnDriveImageButtonClickListener onDriveImageButtonClickListener) {        mOnDriveImageButtonClickListener = onDriveImageButtonClickListener;    }    /**设置步行路线按钮点击事件*/    public void setOnWalkImageButtonClickListener(            OnWalkImageButtonClickListener onWalkImageButtonClickListener) {        mOnWalkImageButtonClickListener = onWalkImageButtonClickListener;    }}

布局文件源码

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    style="@style/ActionBar"    android:baselineAligned="false"    android:focusable="true" >    <LinearLayout        android:id="@+id/header_layout_leftview_container"        android:layout_width="wrap_content"        android:layout_height="fill_parent"        android:layout_alignParentLeft="true"        android:gravity="center_vertical|left"        android:orientation="horizontal" >    </LinearLayout>    <LinearLayout        android:id="@+id/header_layout_middleview_container"        android:layout_width="wrap_content"        android:layout_height="fill_parent"        android:layout_centerHorizontal="true"        android:layout_centerVertical="true"        android:gravity="center"        android:orientation="horizontal" >        <TextView            android:id="@+id/header_htv_subtitle"            style="@style/ActionBarTitle"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />    </LinearLayout>    <LinearLayout        android:id="@+id/header_layout_rightview_container"        android:layout_width="wrap_content"        android:layout_height="fill_parent"        android:layout_alignParentRight="true"        android:gravity="center_vertical|right"        android:orientation="horizontal" >    </LinearLayout></RelativeLayout>

今天就到这里,很简单的几个类,但是却是整个项目的基础,接下来继续加油。

0 0
原创粉丝点击