我的代码库(持续更新...)

转载请注明出处: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)




源码地址, 欢迎Star

https://github.com/jinguangyue/CodeLibrary

Algorithms   本次README修订为算法仓Algorithms的第100次commit,首先我们庆祝自2016年8月4日本仓建立以来Dev-XYS在算法学习方面取得的显著进步!   这里有各种算法的C++代码,任何人可以在自己的任何程序中使用,欢迎大家指出代码中的错误以及有待改进的地方。   本仓内所有代码的授权方式为Unlicense,大家如果使用我的代码开发自己的软件挣了大钱,或是参考我的代码在NOI中得了金牌,我都会很高兴的。使用这里的代码之后,你可以自主选择是否公开源代码。总而言之,你可以把这里的代码当作你自己写的一样,无论怎样使用都是被允许的。但是,我不对本仓代码的正确性负责。大家要是使用我的代码开发软件而导致程序崩溃,或是参考我的代码在考试时出错,请不要向我抱怨。如果你愿意,遇到问题可以在Issues中提出来,我们共同解决。我们不赞成Pull Request,因为本仓主要储存作者已经学习的算法,全部代码均由作者本人负责维护与更新。   以下索引提供了本仓内算法的中文名,方便大家查找。更新可能有很长时间的延迟,不保证所有算法的名称都在列表中出现。 Index --------------------------Contents-------------------------- --------------------------FileName-------------------------- AC自动机 Aho-Corasick-Automation 单源最短路径(SPFA) Bellman-Ford(Queue-Optimised) 单源最短路径(Bellman-Ford) Bellman-Ford 使用Edmonds-Karp进行二分图匹配 Bigrpah-Matching(Edmonds-Karp) 普通的二叉搜索树 Binary-Search-Tree 广度优先搜索 Breadth-First-Search 冒泡排序 Bubble-Sort 桶排序 Bucket-Sort 组合数的递推求解 Combination(Recursion) 枚举组合 Combination 基本的复数类 Complex-Number 割点 Cut-Vertex 深度优先搜索 Depth-First-Search 堆优化的Dijkstra算法 Dijkstra(Heap-Optimised) 并查集 Disjoint-Set-Union 最大流Edmonds-Karp算法 Edmonds-Karp 欧拉函数 Euler's-Totient-Function 有向图的欧拉回路 Eulerian-Tour(Digraph) 拓展欧几里得算法 Extended-Euclid 简单的快速幂 Fast-Exponentiation 树状数组 Fenwick-Tree 所有结点对之间的最短路径(Floyd) Floyd-Warshall 凸包算法(Graham扫描法) Graham-Scan 辗转相除法求最大公约数 Greatest-Common-Divisor 堆排序 Heap-Sort ISAP算法 Improved-Shortest-Augmenting-Path(Naive) 插入排序 Insertion-Sort 字符串匹配(KMP) Knuth-Morris-Pratt 最小生成树(Kruskal) Kruskal 最近公共祖先(Tarjan) Least-Common-Ancestor(Tarjan) 使用后缀数组求解最长公共子串 Longest-Common-Substring 最长上升子序列(n·log(n)) Longest-Increasing-Subsequence(n·log(n)) 倍增法求最近公共祖先 Lowest-Common-Ancestor(Doubling) 朴素的矩阵乘法 Matrix-Multiplication(Naive) 归并排序 Merge-Sort 最小堆 Min-Heap 乘法逆元 Modular-Multiplicative-Inverse 仅支持单点修改的可持久化线段树(维护区间和值) Persistent-Segment-Tree(Sum) 试除法素数测试 Prime-Check(Naive) 线性的素数筛法 Prime-Sieve(Linear) 队列的基本操作 Queue 快速排序的优化版本 Quick-Sort(Extra-Optimised) 快速排序的随机化版本 Quick-Sort(Randomized) 快速排序 Quick-Sort 使用向量叉积判断两个有向线段的时针关系 Segment-Direction 线段树维护区间最大值 Segment-Tree(Maximum) 线段树维护区间最小值 Segment-Tree(Minimum) 线段树维护区间和值 Segment-Tree(Sum) 普通的选择算法 Selection Eratosthenes素数筛法 Sieve-of-Erotosthenes 指针版的单向链表 Singly-Linked-List(Pointer) 跳表 Skip-List ST表 Sparse-Table 伸展树 Splay 博弈论SG函数 Sprague-Grundy 栈的基本操作 Stack 递推法求解无符号第一类斯特林数 Stirling-Number(Cycle,Unsigned,Recursion) 递推法求解第二类斯特林数 Stirling-Number(Subset,Recursion) 倍增法求解后缀数组 Suffix-Array(Doubling) 倍增法求解后缀数组(附带Height数组) Suffix-Array-with-Height(Doubling) 使用Tarjan算法求解强连通分量 Tarjan(Strongly-Connected-Components) 数组版的字典树 Trie(Array) 指针版的字典树 Trie(Pointer)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值