前一篇我们已经把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>
今天就到这里,很简单的几个类,但是却是整个项目的基础,接下来继续加油。