千里之行,始于足下(二)-------创建基类
来源:互联网 发布:西安白队长 知乎 编辑:程序博客网 时间: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
- 千里之行,始于足下(二)-------创建基类
- 千里之行,始于足下(开篇随笔)
- 千里之行,始于足下。
- 千里之行,始于足下...
- 千里之行,始于足下
- 千里之行,始于足下
- 千里之行,始于足下
- 千里之行,始于足下
- 千里之行,始于足下
- 千里之行,始于足下
- 千里之行,始于足下
- 千里之行 始于足下
- 千里之行,始于足下
- 千里之行,始于足下
- 千里之行,始于足下
- 千里之行,始于足下
- 千里之行,始于足下
- 千里之行,始于足下
- rabbitmq 服务器管理工具 -rabbitmqadmin
- JSP有三大指令
- Rabbitmq Durability and related matters
- 一对一外键关联关系的理解与实践
- ubuntu设置minicom
- 千里之行,始于足下(二)-------创建基类
- C语言宏与单井号(#)和双井号(##)
- 浅谈英雄联盟之比尔吉沃特事件-一个游戏的生存方式
- How to use Spring @Component, @Repository, @Service and @Controller Annotations?
- 多源最短路
- EasyUI 的常用方法
- vim常用插件及安装
- [Objective-c]_[NSUserDefaults]_[基本使用]
- 背景建模(前景检测)算法入门 下篇