转载请注明出处:http://blog.csdn.net/coderyue/article/details/51729357 来自Coderyue的博客
开篇声明
开发 Android 有一段时间了, 在实际开发过程中写了很多冗余的代码, 于是蹦出了一个想法, 封装一个自己的代码库, 一处更改,多处运行, 发现已经有好多人这么做了!我也迫不及待的开始了。部分代码是我搜集整理! (以下并没有附上全部效果图, 可以到文章后面的源代码下载地址下载代码或者安装apk查看)
BaseActivity 和 BaseFragment
写一个强大的Base类我只能说很关键, 就是拼爹啊! 父亲把很多活都干了儿子们就很方便了。 我的BaseActivity主要代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
onBefore();
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
initialize();
initView();
initData();
onAfter();
if (addTask)
ActivityManager.getInstance().addActivity(this);
}
/**
* onCreate 执行之前的操作
*/
protected void onBefore() {
this.context = this;
this.activity = this;
}
/**
* 用于初始化对象,获取Intent数据等操作
*/
protected abstract void initialize();
/**
* 用于初始化视图,获取控件实例
*/
protected abstract void initView();
/**
* 用于初始化数据,填充视图
*/
protected void initData() {
}
/**
* 用于执行数据填充完后的操作
*/
protected void onAfter() {
}
@Override
protected void onResume() {
super.onResume();
//可初始化友盟统计
// MobclickAgent.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
// MobclickAgent.onPause(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (addTask)
ActivityManager.getInstance().delActivity(this);
}
/**
* 增加默认的界面切换动画
*/
@Override
public void startActivity(Intent intent) {
startActivity(intent, true);
}
public void startActivity(Intent intent, boolean anim) {
super.startActivity(intent);
if (anim) overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
}
@Override
public void startActivityForResult(Intent intent, int requestCode) {
startActivityForResult(intent, requestCode, true);
}
public void startActivityForResult(Intent intent, int requestCode, boolean anim) {
super.startActivityForResult(intent, requestCode);
if (anim) overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
}
@Override
public void finish() {
finish(true);
}
public void finish(boolean anim) {
super.finish();
if (anim) overridePendingTransition(R.anim.in_from_left, R.anim.out_to_right);
}
protected void getTitleBar() {
titleBack = (ImageButton) findViewById(R.id.title_back);
titleText = (TextView) findViewById(R.id.title_text);
titleAction = (ImageButton) findViewById(R.id.title_action);
}
onBefore: onCreate 执行之前的操作
initialize(): 可用于初始化上一个页面传递进来的数据, 初始化xml
initView(): 初始化视图
initData():初始化数据, 填充视图
onAfter():数据填充之后的操作
重写onResume和onPause可以做一些友盟统计,这样每个子类里面就不用都写一遍了。
上面的startActivity,finish和startActivityForResult的重载可用于页面之间的切换动画
我们经常用到titleBar, 可以在父类里面初始化好
下面看子类
public class MainActivity extends BaseActivity implements View.OnClickListener {
@Override
protected void initialize() {
//初始化布局
setContentView(R.layout.activity_main);
}
@Override
protected void initView() {
getTitleBar();
//直接使用 并且设置显示隐藏和点击事件
titleBack.setOnClickListener(this);
//设置title
titleText.setText("title");
titleAction.setVisibility(View.GONE);
}
@Override
protected void initData() {
super.initData();
}
@Override
public void onClick(View v) {
}
}
我的BaseFragment
结构上和BaseActivity差不多, 这里直接贴上子类代码,如果有兴趣可以下载我的源码查看
public class MyFragment extends BaseFragment {
@Override
protected void initialize() {
//初始化布局
initLayout(R.layout.fragment_my);
}
@Override
protected void initView() {
//这里只需findView
TextView textView = (TextView) findView(R.id.text);
}
}
自定义Dialog
ActionSheetDialog:一个仿IOS的ActionSheetDialog
You can do this:
new ActionSheetDialog(activity)
.builder()
.setCancelable(false)
.setCanceledOnTouchOutside(false)
.addSheetItem("第一个栏目", ActionSheetDialog.SheetItemColor.Blue,
new ActionSheetDialog.OnSheetItemClickListener() {
@Override
public void onClick(int which) {
}
})
.addSheetItem("第二个栏目", ActionSheetDialog.SheetItemColor.Blue,
new ActionSheetDialog.OnSheetItemClickListener() {
@Override
public void onClick(int which) {
}
}).show();
效果图:
LoadingDialog:
效果图: 可以设置旋转图片,翻转方式等等
常用的确认dialog
你可以这样写:
new PromptDialog.Builder(context)
.setTitle(com.code.library.R.string.framework_tishi)
.setViewStyle(PromptDialog.VIEW_STYLE_NORMAL)
.setTitleSize(20)
.setTitleBarGravity(Gravity.CENTER)
.setMessage(com.code.library.R.string.framework_dangqianwukeyongwangluo)
.setMessageGravity(Gravity.CENTER)
.setButton2(com.code.library.R.string.framework_shezhi,
new PromptDialog.OnClickListener() {
@Override
public void onClick(Dialog dialog, int which) {
}
})
.setButton1(com.code.library.R.string.framework_xuxiao,
new PromptDialog.OnClickListener() {
@Override
public void onClick(Dialog dialog, int which) {
}
}).show();
效果图:
封装好之后只需几行代码就可以调用啦!
网络请求
封装Okhttp框架做网络请求, 采用Builder模式
这里一些代码和思路来自 鸿洋 的博客
get请求
OkHttpUtils
.get()
.url(url)
.tag("tag")
.addParams("key", "value")
.build()
.execute(new JsonCallBack<T>());
这里通过泛型自动解析实体类, 你也可以自己写CallBack, 可以返回String, 返回bitmap等等, 这里的tag最好设置上, 并且在当前Activity的ondestroy方法里取消当前tag的请求, 因为网络请求可能还没执行完但是Activity已经关闭了
Post请求
OkHttpUtils
.post()
.url(url)
.addParams("key", "value")
.addParams("key", "value")
.build()
.execute(callback);
下载文件到指定目录
DownloadHelper.getInstance().download("url", "savepath", new DownloadHelper.OnDownloadListener() {
@Override
public void onSuccess(String path) {
//返回成功
}
@Override
public void onError(String message) {
}
@Override
public void onProgress(float progress) {
//返回的进度
}
});
Toast工厂 避免重复创建Toast
ToastFactory.showToast(context, "showToast");
一些常用的工具类
ActivityManager
已经在上面的BaseActivity里面集成
将所有Activity存储起来, 使用:比如回到首页时清除非首页的所有Activity
AppUtil
判断应用是否已安装:
AppUtil.isInstalled(context, "packageName");
通过包名打开应用:
AppUtil.openCLD( "packageName", context);
打开APk文件:
AppUtil.getApkFileIntent("packageName");
StatusBarHeightUtil 获取状态栏高度
StatusBarHeightUtil.getStatusBarHeight(context);
CommandAppUtil 应用打开方式
1 跳转应用市场
CommandAppUtil.command(context, "packageName");
2 打开url跳转浏览器
CommandAppUtil.openUrl(context, "url");
3 系统方式分享图片
CommandAppUtil.sharePhotoMore(activity, "img_path");
4 todo 直接下载url
NetworkUtil 检查网络
网络是否可用:
NetworkUtil.isAvailable(context)
Wifi是否可用:
NetworkUtil.isWIFIActivate(context);
打开网络设置页面:
startNetSettingActivity
SystemUtils 常用系统工具
dp2px:
SystemUtils.dp2px(context, 1);
px2dp:
SystemUtils.px2dp(context, 1);
显示和隐藏输入法:
SystemUtils.showInputmethod(view);
SystemUtils.hideInputmethod(view);
当前系统是否是中文:
SystemUtils.isZh()
封装SharedPreferences
读写数据:
SharedConfig.getInstance(context).writeData("key", "value");
SharedConfig.getInstance(context).readString()
SharedConfig.getInstance(context).readBoolean()
SharedConfig.getInstance(context).readInt()
Md5转换: MD5Utils
将字符串转MD5:
MD5Utils.Md5("string")
将字节数组转为MD5字符串:
MD5Utils.Md5("bytes")
获取设备信息: DeviceInfoUtils
得到手机IMEI:
DeviceInfoUtils.getImei(context)
获取屏幕宽高:
DeviceInfoUtils.getScreenHeight()
DeviceInfoUtils.getScreenWidth()
获取屏幕密度:
DeviceInfoUtils.getScreenDensity()
获得设备型号:
DeviceInfoUtils.getDeviceModel()
获得设备制造商:
DeviceInfoUtils.getManufacturer()
是否ROOT:
DeviceInfoUtils.isRoot()
输出可用内存:
DeviceInfoUtils.getAvailMemory()
输出总内存:
DeviceInfoUtils.getTotalMemory()
文件读取 :FileUtil
FileUtil.getFileUtil().readTxtFile()//读取文件返回字符串 使用StringBuider
FileUtil.getFileUtil().deleteDirectory(path)//删除目录(文件夹)以及目录下的文件
FileUtil.getFileUtil().deleteFile(filename)//删除单个文件
FileUtil.getFileUtil().getSuffixFile(List<String> files, String filePath, String suffere)//读取sd卡上指定后缀的所有文件
获取本地资源工具类 ArrayResource
如果你想获得在drawable下面多个有规律的图片, 你肯定不能每个都去R.drawable. 此时你可以这样组装起来:
public static int[] getBgResourceInts(Context context) {
if (bgResourceInts == null) {
bgResourceInts = new int[17];
for (int i = 0; i < bgResourceInts.length; i++) {
//假如你有很多图片叫做bg0, bg1, bg2...
int drawable = context.getResources().getIdentifier("bg" + i,
"drawable", context.getPackageName());
bgResourceInts[i] = drawable;
}
}
return bgResourceInts;
}
图片处理类BitmapUtils
//保存图片并且通知系统及时更新
BitmapUtils.saveJPGE_After(Context context, Bitmap bitmap, String path, int quality)
//旋转图片一定角度
BitmapUtils.rotaingImageView(int angle, Bitmap bitmap)
//翻转bitmap
BitmapUtils.flip(Bitmap bitmap)
//将view转换成bitmap
BitmapUtils.getViewBitmap(View view)
BitmapUtils.convertViewToBitmap(View view)
//返回一张黑白图片 饱和度为0
BitmapUtils.returnSaturationBitmap(Bitmap bitmap)
//返回圆形bitmap
BitmapUtils.getRoundedCornerBitmap(Bitmap bitmap)
//我们转换成bitmap的时候往往出现内存溢出的现象, 此时可以这样做, 给定bitmap一个期望的宽高, 可以是屏幕宽高, 这样不至于获取bitmap的时候出现内存溢出现象
//from Resource
BitmapUtils.decodeBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight);
//from File
BitmapUtils.decodeFile(String path, int screenWidth, int screenHeight);
//createBitmap
BitmapUtils.createBitmap(Bitmap bitmap, int reqWidth, int reqHeight)