安卓基础开发库,DevRing使用说明

https://github.com/LJYcoder/DevRing

介绍

安卓基础开发库 :主要包括 网络请求、图片加载、数据库、事件总线、缓存、权限管理、工具类 模块。

其中,网络请求使用Retrofit+RxJava实现,图片加载使用Glide实现(可替换),数据库使用GreenDao实现(可替换),事件总线使用EventBus实现(可替换),权限管理使用RxPermission实现。

对以上提及的框架如果不熟悉,建议先行了解~
具体使用可查看Demo示例,如果觉得对你有帮助,不妨点个★star支持鼓励我~

使用说明

1. 添加依赖

在项目module下的gradle中添加以下依赖:

compile 'com.ljy.ring:devring:x.x.x'  //版本号请到github确认

2. 初始化、配置、构建

在Application的onCreate中进行初始化、配置、构建。
务必按顺序执行这三步。

2.1 初始化

DevRing.init(this);

2.2 配置

根据你的需求进行相关模块的全局配置,下面将对每个配置方法进行说明。

2.2.1 配置网络请求模块

DevRing.configureHttp()
        //设置BaseUrl
        .setBaseUrl(UrlConstants.BASE_URL)
        //设置请求超时时长,单位秒
        .setConnectTimeout(15)
        //是否开启Cookie,默认不开启
        .setIsUseCookie(true)
        //设置Cookie是否为持久化类型
        .setIsCookiePersistent(true)
        //设置全局的header信息
        .setMapHeader(mapHeader)
        //设置是否启用缓存,默认不启用
        .setIsUseCache(true)
        //设置缓存地址,传入的file需为文件夹,默认保存在/storage/emulated/0/Android/data/com.xxx.xxx/cache/retrofit_http_cache下
        .setCacheFolder(file)
        //设置缓存大小,单位byte,默认20M
        .setCacheSize(size)
        //设置有网络时缓存保留时长,单位秒,默认60秒
        .setCacheTimeWithNet(time)
        //设置无网络时缓存保留时长,单位秒,默认一周
        .setCacheTimeWithoutNet(time)
        //设置是否开启失败重试功能,目前仅支持普通的网络请求,上传下载不支持。默认不开启
        .setIsUseRetryWhenError(true)
        //设置失败后重试的最大次数,默认3次
        .setMaxRetryCount(2)
        //设置失败后重试的延迟时长,单位秒,默认3秒
        .setTimeRetryDelay(5)
        //设置是否开启Log,默认不开启
        .setIsUseLog(true);

如果以上的配置无法满足你的要求,那么可以通过以下方法获取相关Builder进行具体定制(不需要调用Builder的build()方法,后面发起网络请求时内部会自动进行build操作。)

//获取OkHttpClient.Builder
DevRing.configureHttp().getOkHttpClientBuilder().xxx();
//获取Retrofit.Builder
DevRing.configureHttp().getRetrofitBuilder().xxx();

2.2.2 配置图片加载模块

DevRing.configureImage()
        //设置“加载中”状态时显示的图片
        .setLoadingResId(R.mipmap.ic_image_load)
        //设置“加载失败”状态时显示的图片
        .setErrorResId(R.mipmap.ic_image_load)
        //设置是否开启状态切换时的过渡动画,默认false
        .setIsShowTransition(true)
        //设置是否使用okhttp3作为网络组件,默认true
        .setIsUseOkhttp(false)
        //设置内存缓存大小,不建议设置,使用框架默认设置的大小即可
        .setMemoryCacheSize(size)
        //设置Bitmap池大小,设置内存缓存大小的话一般这个要一起设置,不建议设置,使用框架默认设置的大小即可
        .setBitmapPoolSize(size)
        //设置磁盘缓存地址是否在外部存储中,默认false
        .setIsDiskCacheExternal(true)
        //设置具体的磁盘缓存地址,传入的file需为文件夹
        .setDiskCacheFile(file)
        //设置磁盘缓存大小,单位byte,默认250M
        .setDiskCacheSize(200*1024*1024);

如果你需要替换默认实现的图片框架(Glide),那么

  1. 创建图片管理者类,要求实现IImageManager接口
  2. 通过DevRing.configureImage(IImageManager)方法传入图片管理者类
  3. 传入后和上面一样可以进行相关配置。
DevRing.configureImage(new FrescoManager())
        .setXXX()
        ...
        .setXXXX();

具体可查看Demo,演示了如何使用Fresco替换Glide
替换为Fresco后,相关的ImageView需换成SimpleDraweeView。

2.2.3 配置事件总线模块

DevRing.configureBus()//配置默认的EventBus
        //设置用于加速的Index,具体生成方法请参考我的那篇EventBus介绍
        .setIndex(new MyEventBusIndex())
        //设置是否使用index进行加速
        .setIsUseIndex(true);

如果你需要替换默认实现的事件总线框架(EventBus),那么

  1. 创建事件总线管理者类,要求实现IBusManager接口
  2. 通过DevRing.configureBus(IBusManager)方法传入事件总线管理者类
DevRing.configureBus(new RxBusManager());

具体可查看Demo,演示了如何使用RxBus替换EventBus

2.2.4 配置数据库模块

由于GreenDao的特殊性以及具体数据表的不确定,无法很好地集成到DevRing当中。
所以需要进行如下操作:

  1. 创建数据库管理者类,要求实现IDBManager接口
  2. 通过DevRing.configureDB(IDBManager)方法传入数据库管理者。
  • DevRing中已提供了GreenDao的一些辅助类,如数据表管理者基类,以及用于数据库升级迁移数据的OpenHelper。
    所以创建起来不会复杂,具体过程请参考Demo
DevRing.configureDB(new GreenDBManager());

使用其他数据库的话,也同样是通过DevRing.configureDB(IDBManager)方法传入数据库管理者。
Demo中演示了如何使用原生的数据库替换GreenDao

DevRing.configureDB(new NativeDBManager());

2.2.5 配置缓存模块

DevRing.configureCache()
        //设置磁盘缓存最大缓存大小,单位为byte,默认无上限
        .setDiskCacheMaxSize(50*1024*1024)
        //设置磁盘缓存的文件夹数量上限,默认无上限
        .setDiskCacheMaxCount(10)
        //配置磁盘缓存的地址,传入的File需为文件夹,默认保存在/data/user/0/com.xxx.xxx/cache下
        .setDiskCacheFolder(file);

2.2.6 配置其他模块

DevRing.configureOther()
        //设置是否开启崩溃日志功能,默认不开启
        .setIsUseCrashDiary(true)
        //设置崩溃日志的输出地址,传入的file需为文件夹,默认保存在/storage/emulated/0/Android/data/com.xxx.xxx/cache/crash_log下
        .setCrashDiaryFolder(file)
        //设置是否显示Ringlog打印的内容,默认true
        .setIsShowRingLog(true)
        //设置Toast样式,不设置的话则采用系统默认的Toast效果
        //toastStyle的实现可参考库中自带的ToastBlackStyle,或者Demo中的CustomToastStyle
        //如果需要在具体场景中动态切换样式,调用RingToast.initStyle(toastStyle)即可
        .setToastStyle(toastStyle);

2.3 构建

DevRing.create();


3. 开始调用

几大模块都是通过DevRing.xxxManager()得到管理者,然后进行具体操作。

3.1 网络请求模块

3.1.1 获取Retrofit的请求API接口

DevRing.httpManager().getService(XXXApiService.class);

比如:获取用于登录请求的Observable

Observable observable = DevRing.httpManager().getService(UserApiService.class).login();

3.1.2 普通请求

DevRing.httpManager().commonRequest(observable, new CommonObserver<HttpResult<List<MovieRes>>>() {
    @Override
    public void onResult(HttpResult<List<MovieRes>> result) {
    }

    @Override
    public void onError(HttpThrowable throwable){
    }
}, TAG);

调用commonRequest()方法发起普通请求

  • 参数1为普通的网络请求Observable,如3.1.1中的登录请求Observable。
  • 参数2为请求回调Observer。
    • 库中提供了CommonObserver,对异常信息进行了简单封装。
  • 参数3可传入String类型的Tag来控制生命周期(终止网络请求)
    • 例如传入"yourTag",当想要手动终止该请求时,调用DevRing.httpManager().stopRequestByTag("yourTag"); 即可
  • 参数3也可传入用于控制生命周期的LifecycleTransformer。
    • 可通过RxLifecycleUtil来获取与页面生命周期绑定的LifecycleTransformer。
    • 例如传入RxLifecycleUtil.bindUntilEvent(lifeEmitter, FragmentEvent.DESTROY)),则表示该请求会在Fragment Destroy时销毁。其中lifeEmitter须实现IBaseFragment接口。
    • 例如传入RxLifecycleUtil.bindUntilEvent(lifeEmitter, ActivityEvent.DESTROY)),则表示该请求会在Activity Destroy时销毁。其中lifeEmitter须实现IBaseActivity接口。
    • 你也可以使用RxLifecycleUtil.RxBindUntilEvent(Observable<R> lifecycleable, R event)方法来获取,其中lifecycleable为事件发射者,event用于指定销毁的事件(时机)。 涉及RxJava,不了解的可以先查看Retrofit+RxJava的生命周期控制部分。
    • 传入null 则表示不对该请求进行生命周期控制

3.1.3 上传请求,可监听进度

DevRing.httpManager().uploadRequest(observable, new UploadObserver(UrlConstants.UPLOAD) {
     @Override
     public void onResult(Object result) {
     }

     @Override
     public void onError(long progressInfoId, HttpThrowable throwable) {
     }

     @Override
     public void onProgress(ProgressInfo progressInfo) {
     }
}, TAG);

调用uploadRequest()方法发起上传请求

  • 参数1为上传的网络请求Observable。
  • 参数2为上传的请求回调UploadObserver,可用于监听上传进度。
    • 如果不需要监听上传进度,则使用空的构造函数,或者使用3.1.2的commonRequest
    • 如果是普通地监听某个上传的进度,则使用一个参数的构造函数,并传入上传的URL地址
    • 如果是使用同一个URL但根据请求参数的不同而上传不同资源的情况,则使用两个参数的构造函数,第一个参数传入上传的URL地址,第二参数传入自定义的字符串加以区分。
    • onProgress(ProgressInfo progressInfo) 中获取进度信息
    • onError(long progressInfoId, String errMessage) 中的progressInfoId为0,则为请求相关的异常,如果不为0,则为上传读写过程的异常
  • 参数3在 3.1.2中已作了说明

3.1.4 下载请求,可监听进度

DevRing.httpManager().downloadRequest(file, observable, new DownloadObserver(UrlConstants.DOWNLOAD) {
    @Override
    public void onResult(boolean isSaveSuccess, String filePath) {
    }

    @Override
    public void onError(long progressInfoId, HttpThrowable throwable) {
    }

    @Override
    public void onProgress(ProgressInfo progressInfo) {
    }
}, TAG);

调用downloadRequest()方法发起下载请求

  • 参数1为目标保存文件,下载的内容将保存于此。
  • 参数2为下载的网络请求Observable。
  • 参数3为下载的请求回调DownloadObserver,可用于监听下载进度。
    • 如果不需要监听下载进度,则使用空的构造函数,或者使用3.1.2的commonRequest
    • 如果是普通地监听某个下载的进度,则使用一个参数的构造函数,并传入下载的URL地址
    • 如果是使用同一个URL但根据请求参数的不同而下载不同资源的情况,则使用两个参数的构造函数,第一个参数传入下载的URL地址,第二参数传入自定义的字符串加以区分。
    • onResult(boolean isSaveSuccess, String filePath) 中的isSaveSuccess表示是否成功保存到目标文件中,filePath为目标文件的绝对路径。
    • onProgress(ProgressInfo progressInfo) 中获取进度信息
    • onError(long progressInfoId, String errMessage) 中的progressInfoId为0,则为请求相关的异常,如果不为0,则为下载读写过程的异常
  • 参数4在 3.1.2中已作了说明

下载方面并没提供"多线程下载"、"断点续传"的功能。
如果需要的话,这里推荐github上的下载框架FileDownloader1FileDownloader2

3.1.5 刷新管理者

如果你在2.2配置初始化后,需要对Http的全局配置进行修改,
请在修改配置后调用DevRing.httpManager().refreshInstance(); 进行刷新,
它将根据你最新的Http配置进行重新构建。

3.2 图片加载模块

3.2.1 普通加载图片

DevRing.imageManager().loadNet(url, imageView); //加载网络图片到控件
DevRing.imageManager().loadRes(resId, imageView);//加载res资源图片到控件
DevRing.imageManager().loadAsset(assetName, imageView);//加载asset资源图片到控件
DevRing.imageManager().loadFile(file, imageView);//加载本地图片文件到控件
  • 将自动使用 2.2.2 配置的“加载中显示的图片”,“加载失败显示的图片”,“是否开启过渡效果” 来进行加载。

3.2.2 定制化加载图片

相比3.2.1,多了一个LoadOption参数,用于设置加载选项。

//加载图片,并应用圆角、模糊、灰白效果。
DevRing.imageManager().loadXXX(url, imageView, new LoadOption().setRoundRadius(80).setIsGray(true).setBlurRadius(5));

LoadOption目前支持设置

  • 加载中状态显示的图片
  • 加载失败状态显示的图片
  • 是否开启状态切换时的过渡动画
  • 是否加载为圆形图片
  • 加载为圆角图片的圆角值
  • 加载为模糊图片的模糊值
  • 是否加载为灰白图片
  • 边框的颜色与粗细(目前仅支持圆形模式)

3.2.3 预加载图片

DevRing.imageManager().preLoad(url);

3.2.4 获取网络图片的Bitmap

DevRing.imageManager().getBitmap(context, url, new ImageListener<Bitmap>(){
    @Override
    public void onSuccess(Bitmap result) {
          //获取成功,回调在主线程
    }

    @Override
    public void onFail(Throwable throwable) {
          //获取失败,回调在主线程
    }
});

3.2.5 下载图片到指定文件

DevRing.imageManager().downLoadImage(context, url, file, new ImageListener<File>(){
    @Override
    public void onSuccess(File result) {
          //下载成功,回调在后台线程
    }

    @Override
    public void onFail(Throwable throwable) {
          //下载失败,回调在后台线程
    }
});

3.2.6 清空内存缓存

DevRing.imageManager().clearMemoryCache();

3.2.7 清空磁盘缓存

DevRing.imageManager().clearDiskCache();

3.2.8 调用接口以外的方法

如果图片管理者中定义了IImageManager接口以外的方法,可以通过传入具体类型来调用,如下:

DevRing.<FrescoManager>imageManager().xxx();


3.3 事件总线模块

3.3.1 订阅

DevRing.busManager().register(subscriber);

3.3.2 解除订阅

DevRing.busManager().unregister(subscriber);

3.3.3 发送普通事件

DevRing.busManager().postEvent(event);

3.3.4 发送粘性事件

DevRing.busManager().postStickyEvent(event);

3.3.5 调用接口以外的方法

如果事件总线管理者中定义了IBusManager接口以外的方法,可以通过传入具体类型来调用,如下。

DevRing.<EventBusManager>busManager().cancelDelivery(event);


3.4 数据库模块

需先在数据库管理者(实现IDBManager接口)中的putTableManager()方法里,将数据表管理者通过(kye,value)方式放进Map中。

public class GreenDBManager implements IDBManager {

    MovieTableManager mMovieTableManager;

    .....

    @Override
    public void putTableManager(SimpleArrayMap<Object, ITableManger> mapTables) {
        mapTables.put(Movie.class, mMovieTableManager);
    }
}

其中的MovieTableManager 是实现了ITableManger的数据表管理者。
如果你数据库模块的实现也使用GreenDao框架,那么可以继承Devring中提供的数据表管理者基类GreenTableManager,重写getDao()方法返回自动生成的对应表的Dao类,即可快速完成数据表管理者的创建。具体过程请参考Demo。

然后通过key值获取对应的数据表管理者,并进行增删改查等操作。

DevRing.tableManager(Movie.class).xxx();

3.4.1 增

DevRing.tableManager(key).insertOne(object); //插入一个数据
DevRing.tableManager(key).insertSome(list); //插入多个数据 
DevRing.tableManager(key).insertOrReplaceOne(object); //插入一个数据,如果已存在则进行替换,根据主键来判断是否已存在
DevRing.tableManager(key).insertOrReplaceSome(list); //插入多个数据,如果已存在则进行替换,根据主键来判断是否已存在

3.4.2 删

DevRing.tableManager(key).deleteOne(object); //删除一个数据
DevRing.tableManager(key).deleteSome(list); //删除多个数据
DevRing.tableManager(key).deleteOneByKey(primarykey); //根据主键删除一个数据
DevRing.tableManager(key).deleteSomeByKeys(listPrimarykey); //根据主键删除多个数据
DevRing.tableManager(key).deleteAll(); //删除表中所有数据

3.4.3 改

DevRing.tableManager(key).updateOne(object); //更新一个数据
DevRing.tableManager(key).updateSome(list); //更新多个数据

3.4.4 查

DevRing.tableManager(key).loadOne(primarykey); //根据主键获取一个数据
DevRing.tableManager(key).loadAll(); //获取全部数据
DevRing.tableManager(key).count(); //获取表数据的数量
DevRing.tableManager(key).rawQuery(sql, selectionArgs); //条件查询

3.4.5 执行SQL语句

DevRing.tableManager(key).execSQL(sql); //执行SQL语句

3.4.6 调用接口以外的方法

如果表管理者中定义了ITableManager接口以外的方法,可以通过传入具体类型来调用。
例如:GreenTableManager中另外定义了queryBuilder()方法,用于各种更高级查询,
具体可查看我的那篇GreenDao使用介绍

DevRing.<GreenTableManager>tableManager().queryBuilder().list();


3.5 缓存模块

3.5.1 内存缓存

DevRing.cacheManager().memoryCache().put(key, object); //存入数据
DevRing.cacheManager().memoryCache().get(key); //取出数据
DevRing.cacheManager().memoryCache().remove(key); //移除数据
DevRing.cacheManager().memoryCache().contains(key); //是否包key值对应的数据
DevRing.cacheManager().memoryCache().clear(); //清空所有数据

3.5.2 磁盘缓存,可指定缓存时长

DevRing.cacheManager().diskCache(name).put(key, object); //存入数据
DevRing.cacheManager().diskCache(name).put(key, object, saveTime); //存入数据,并指定缓存时长
DevRing.cacheManager().diskCache(name).getXXX(key); //取出数据
DevRing.cacheManager().diskCache(name).remove(key); //移除数据
DevRing.cacheManager().diskCache(name).getCacheCount(); //获取已缓存的数量
DevRing.cacheManager().diskCache(name).getCacheSize(); //获取已缓存的空间大小
DevRing.cacheManager().diskCache(name).clear(); //清空所有数据

3.5.3 SharedPreference

DevRing.cacheManager().spCache(name).put(key, object); //存入数据
DevRing.cacheManager().spCache(name).getXXX(key); //取出数据
DevRing.cacheManager().spCache(name).getAll(); //取出全部数据
DevRing.cacheManager().spCache(name).remove(key); //移除数据
DevRing.cacheManager().spCache(name).clear(); //清空所有数据


3.6 权限管理模块

DevRing.permissionManager().requestEachCombined(activity, new PermissionListener() {
    @Override
    public void onGranted(String permissionName) {
        //如果全部权限都被授予
    }

    @Override
    public void onDenied(String permissionName) {
        //如果用户拒绝了其中一个授权请求
    }

    @Override
    public void onDeniedWithNeverAsk(String permissionName) {
        //如果用户拒绝了其中一个授权请求,且勾选了不再提醒,则需要引导用户到权限管理页面开启
    }
}, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA);
  • 还提供了一个requestEach()方法,参数都一样。
  • 如果要求申请的权限全都授予才能使用某功能的话,建议使用requestEachCombined()方法来申请。

3.7 Activity管理模块

改自JessYan的AppManager

DevRing.activityListManager().addActivity(activity); //存进一个activity
DevRing.activityListManager().removeActivity(activity); //移除一个activity
DevRing.activityListManager().getCurrentActivity(); //获取在前台的activity
DevRing.activityListManager().getTopActivity(); //获取最近启动的的activity
DevRing.activityListManager().getActivityList(); //获取存放activity的list
DevRing.activityListManager().killActivity(class); //关闭指定class的所有activity
DevRing.activityListManager().activityInstanceIsLive(activity); //指定的activity实例是否存活
DevRing.activityListManager().activityClassIsLive(class); //指定class的activity是否存活(同一个 class可能有多个activity实例)
DevRing.activityListManager().findActivity(class); //获取指定class的activity,没有则返回 null (同一个class有多个实例,则返回最早创建的实例)
DevRing.activityListManager().killAll(); //关闭所有activity
DevRing.activityListManager().killAllExclude(class); //关闭除了指定class的activity以外的所有activity
DevRing.activityListManager().exitApp(); //关闭所有页面并退出应用


3.8 LifeCycleCallback

提供了ActivityLifeCallback 和 FragmentLifeCallback,以实现基类的功能。
只需Activity实现IBaseActivity接口即可完成相关的基类操作。
只需Fragment实现IBaseFragment接口即可完成相关的基类操作。
具体请查看关于基类的那些事 以及项目代码

3.9 工具类

3.9.1 RingLog

可定位输出位置的Log

RingLog.e(TAG, message); //比如打印Error级日志
RingLog.json(TAG, jsonString);//将jsonString格式化后打印出来
RingLog.xml(TAG, xmlString);//将xmlString格式化后打印出来
...

3.9.2 RingToast

吐司工具类,新版修改自ToastUtils

RingToast.show("hello world");
RingToast.show(R.string.appName);
RingToast.show(1234);

//动态修改吐司样式,IToastStyle的实现可参考库中提供的ToastBlackStyle,或者Demo中的CustomToastStyle
RingToast.initStyle(IToastStyle) 

3.9.3 UltimateBar

状态栏/导航栏颜色工具类。
来自UltimateBar,具体用法到里面查阅。

3.9.4 FileUtil

文件工具类

FileUtil.getUriForFile(context, file); //根据file获取uri,适配7.0系统
FileUtil.isSDCardAvailable(); //SD卡是否能用
FileUtil.getDirectory(parentDirectory, directory); //获取文件夹
FileUtil.getFile(parentDirectory, name); //获取文件
FileUtil.getFile(filePath); //获取文件
FileUtil.deleteFile(file); //删除文件
FileUtil.calculateFileSize(file); //计算文件大小
FileUtil.copyFile(source, target); //复制文件
FileUtil.saveFile(inputStream, outputStream); //保存文件

....更多方法请查看代码

3.9.5 ImageUitl

图片工具类.
用于对图片进行压缩(比例压缩 / 质量压缩)、跳转到相机/相册、对Bitmap做高斯模糊处理等。

ImageUtil.getImageFromCamera(activity, uri); //使用相机拍照并保存到指定位置
ImageUtil.getImageFromAlbums(activity); //从手机相册中获取照片
ImageUtil.cropImage(activity, cropWidth, cropHeight, photoUri, fileToSave); //使用系统的裁剪图片,并保存至指定位置
ImageUtil.scaleCompress(res/filePath/bitmap, width, height); //按比例压缩,返回bitmap
ImageUtil.qualityCompress(bitmap, maxSize); //质量压缩,直至图片不大于maxSize
ImageUtil.saveBitmapToFile(bitmap, file); //保存图片到文件

....更多方法请查看代码

3.9.6 NetworkUtil

网络状态工具类

NetworkUtil.isNetWorkAvailable(context); //当前网络是否可用
NetworkUtil.getNetWorkType(context); //获取当前网络类型
NetworkUtil.isWifiConnected(context); //当前是否为WIFI连接
NetworkUtil.isMobileConnected(context); //当前是否为移动网络
NetworkUtil.getAPNType(context); //获取apn类型

3.9.7 ConfigUtil

配置相关的工具类

ConfigUtil.getScreenSize(context); //获取屏幕宽高的int数组
ConfigUtil.getScreenLongSide(context); //获取屏幕的长边(即竖屏下的高,横屏下的宽)
ConfigUtil.getScreenShortSide(context); //获取屏幕的短边(即竖屏下的宽,横屏下的高)
ConfigUtil.getStatusBarHeight(context); //获取状态栏高度
ConfigUtil.getNavigationBarHeight(context); //获取底部导航栏高度
ConfigUtil.isApkInDebug(context); //判断当前应用是否是debug模式

3.9.8 FontTypeUtil

修改各控件(TextView,Button,EditText,CheckBox,RadioButton等)中字体样式的工具类

在activity的基类中调用

FontTypeUtil.replaceFont(context, "fonts/FZLanTYJW.ttf"); // 第二个参数为assert文件夹下的字体文件

或者在Application中调用

FontTypeUtil.replaceSystemDefaultFont(context, "fonts/FZLanTYJW.ttf"); // 第二个参数为assert文件夹下的字体文件

另外,在你的APP主题的style中设置

 <style name="AppTheme" parent="...">
        .....
        <item name="android:typeface">monospace</item>
</style>

3.9.9 KeyboardUtil

软键盘工具类。

  • 处理键盘遮挡EditText的问题:
    在activity的onCreate中调用
@Override
protected void onCreate(Bundle savedInstanceState) {
    KeyboardUtil.fixInput(this, isFullScreen); //第二个参数为当前页面是否为全屏模式
}
  • 点击键盘外部收起键盘:
    在activity的dispatchTouchEvent中调用
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    KeyboardUtil.handleKeyboardHide(this, ev);
    return super.dispatchTouchEvent(ev);
}


注意事项

  1. 配置参数为File时,请自行确保对传入的File具有可读写权限。
  2. 部分框架需忽略混淆,具体的混淆配置请参考Demo中app下的proguard-rules.pro文件。
  3. DevRing库中AndroidManifest已添加了网络权限,所以主项目不必重复添加。
  4. DevRing库中已添加了Glide,EventBus,GreenDao,Dagger2,Retrofit2,RxJava2,RxAndroid2,RxLifeCycle2,RxPermission2的依赖,所以主项目不必重复添加。
  5. 可以通过exclude移除DevRing库中相关框架的依赖以减小包体积。 例如:
api ('com.ljy.ring:devring:x.x.x'){
   //如果不需使用图片加载模块或者该模块不使用Glide实现,那么可以加上这句移除Devring库中对Glide的依赖以减小包体积
   exclude module: 'glide'
   //如果不需使用事件总线模块或者该模块不使用EventBus实现,那么可以加上这句移除Devring库中对EventBus的依赖以减小包体积
   exclude module: 'eventbus'
   //如果不需使用数据库模块或者该模块不使用GreenDao实现,那么可以加上这句移除Devring库中对GreenDao的依赖以减小包体积
   exclude module: 'greendao'
}



有什么问题或建议,欢迎提issue或者简信告知~


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,442评论 25 707
  • 分享人:黄华英 OpenLayers 为了调用map,需要做3件事情: 调用OpenLayers map容器 Ja...
    胡諾阅读 481评论 0 1
  • 小玉喜欢留长发,因此十分注意对头发的保养,洗头膏,护发素是必不可少的,她的头发是自然的棕褐色,再配上小玉白皙的脸蛋...
    夜的第七章jx阅读 1,818评论 0 3
  • 爱情是那么美的一个词,美到让人失去理智。但是这种美就像瓶里的鲜花,时间久了,营养跟不上了,也就枯萎了。 被一个男人...
    何以笙歌阅读 155评论 0 0