超时空传送门 https://github.com/zmemo/iFramex
版本:
androidx
targetSdkVersion:27
compileSdkVersion:28
语言:Kotlin
模式:MVP
推荐使用Android Studio 3.5
buildSrc
该模块主要是放置第三方依赖包,以及一些配置文件
缺点是在AS3.3和AS3.4中无法提示,需要手动复制
在修改完之后需要手动进行同步
Config App的一些基本配置
DepConfig 依赖包的基本配置
ModuleConfig 模块化划分的基础配置
iFrameBasic
该模块放置使用api导入第三方依赖包,jar,so,aar等等
放置最小宽度适配工具类,创建基础dimen文件
不允许在该模块中添加其他业务逻辑代码
在其他项目中使用的时候可以直接导入
iFrameTool
该模块为工具类模块,api依赖iFrameBasic
放置项目中通用的工具类
不允许在该模块中添加其他业务逻辑代码
在其他项目中使用的时候可以直接导入
iFrameWidget
该模块为自定义控件模块,api依赖iFrameTool
放置项目中需要的自定义控件
不允许在该模块中添加其他业务逻辑代码
在其他项目中使用的时候可以直接导入
iFrameBase
该模块为项目中的基础模块,api依赖iFrameWidget
该模块在项目中处于一个承上启下的作用,每一个业务模块都会依赖iFrameBase
可以在内部添加一些业务逻辑,比如DbManager,RrtrofitClient等
可以更具项目需求进行更改
iFrameUi
该模块为项目中的独立界面模块,implementation依赖iFrameBase
内部存放一些通用界面,比如二维码扫描,网页界面等一些不需要进行业务逻辑的界面
通过RouterManager进行启动
ModuleTest
一些示例代码都写在ModuleTest中
给自己的提示:需要使用的时候把项目拉下来,看下是如何配置的,因为会经常修改
一些常见的错误提示都写在笔记里了注意看
下面的内容不推荐使用了 还是太年轻 写的很乱
基础依赖
这里依赖的support包为28.0.0,对于androidx是不支持,why?个人局限,因为有很多国内的第三方依赖库他们不进行更新androidx,所以目前是不进行androidx的支持,而有些必须要进行使用,就很难受了。
接下来只是把我使用的框架罗列一下,可以自行尝试一下
kotlin,默认支持,这个没问题
网络请求 RetrofitUrlManager MVPArm的作者 JessYan 动态修改BaseUrl
RxBus,Blankj出品就是AndroidUtilCode的作者
multidex,分包加载
AndroidAutoSize <<< 点开来看下吧(今日头条适配)
1月5日放弃这种适配方案 使用最小宽度限定符适配 主要原因还是一些手机在进行某些系统设置的时候会重置density,使用一些第三方框架适配比较麻烦 两种方案各有优缺点 可以自己进行选择
框架使用方法 只需要添加几行代码就可以进行对app进行界面适配,
<manifest>
<application>
<meta-data
android:name="design_width_in_dp"
android:value="360"/>
<meta-data
android:name="design_height_in_dp"
android:value="640"/>
</application>
</manifest>
一行代码配置对某些页面进行不适配
public class CancelAdaptActivity extends AppCompatActivity implements CancelAdapt {}
public class CancelAdaptFragment extends Fragment implements CancelAdapt {}
Utils com.blankj:utilcode <<< 强烈建议点开来看待 (超级喜欢的😍😍😍)各种工具类详细到你想哭 不写的夸张一点你都不会点么
Activity 相关 -> ActivityUtils.java
AdaptScreen 相关 -> AdaptScreenUtils.java
App 相关 -> AppUtils.java
状态栏 导航栏相关 -> BarUtils.java
磁盘缓存相关 -> CacheDiskUtils.java
二级缓存相关 -> CacheDoubleUtils.java
内存缓存相关 -> CacheMemoryUtils.java
清除相关 -> CleanUtils.java
关闭相关 -> CloseUtils.java
转换相关 -> ConvertUtils.java
崩溃相关 -> CrashUtils.java
设备相关 -> DeviceUtils.java
编码解码相关 -> EncodeUtils.java
加密解密相关 -> EncryptUtils.java
文件相关 -> FileIOUtils.java
文件相关 -> FileUtils.java
Fragment 相关 -> FragmentUtils.java
图片相关 -> ImageUtils.java
意图相关 -> IntentUtils.java
键盘相关 -> KeyboardUtils.java
日志相关 -> LogUtils.java
MetaData 相关 -> MetaDataUtils.java
网络相关 -> NetworkUtils.java
对象相关 -> ObjectUtils.java
路径相关 -> PathUtils.java
权限相关 -> PermissionUtils.java
手机相关 -> PhoneUtils.java
进程相关 -> ProcessUtils.java
反射相关 -> ReflectUtils.java
正则相关 -> RegexUtils.java
资源相关 -> ResourceUtils.java
屏幕相关 -> ScreenUtils.java
SD 卡相关 -> SDCardUtils.java
服务相关 -> ServiceUtils.java
Shell 相关 -> ShellUtils.java
尺寸相关 -> SizeUtils.java
Snackbar 相关 -> SnackbarUtils.java
SpannableString 相关 -> SpanUtils.java
SP 相关 -> SPUtils.java
时间相关 -> TimeUtils.java
字符串相关 -> StringUtils.java
线程相关 -> ThreadUtils.java
时间相关 -> TimeUtils.java
吐司相关 -> ToastUtils.java
URI 相关 -> UriUtils.java
压缩相关 -> ZipUtils.java
BaseRecyclerViewAdapterHelper 为什么RecyclerView如此简单 BRVAH官方使用指南
Bugly 崩溃日志收集上报 腾讯的良心产品
ZoomPreviewPicture 图片的放大预览,暂时这个用的比较舒服
customactivityoncrash 崩溃了,跳转到崩溃展示界面,不会直接闪退
DialogPlus 弹窗么,我帮你
---------- 图片操作三件套 -----------
matisse 图片选择 知乎出品 “优雅”就完事了
ucrop 图片裁剪
luban 可能是最接近微信朋友圈的图片压缩算法
---------- 图片操作三件套 ----------
FlycoTabLayout 头部导航?底部导航?再来个小红点?数字呢?统统没问题
Banner 轮播图
SmartRefreshLayout 安卓智能下拉刷新框架 看了这么多下拉刷新 还是这个最喜欢 简单好用
swipelayout代码家出品 侧滑布局
materialedittext 一个简单设置样式的EditText
RWidgetHelper 设置圆角圆形 三种状态的布局和控件
Glide 图片加载 没毛病
Leakcanary 内存检测 挺好用的 就是自身也会出现问题 有点难受
ext {
root = [
compileSdkVersion: 28,
minSdkVersion : 19,
targetSdkVersion : 28,
versionCode : 100,
versionName : "1.0.0",
applicationId : "zhou.memo.iframe"
]
sdkVersion = [
suppertVersion : "28.0.0",
retrofit2Version : "2.4.0",
okhttpVersion : "3.11.0",
leakCanaryVersion: "1.6.2",
glideVersion : "4.8.0",
kotlinVersion : "1.3.20"
]
test = [
junit : "junit:junit:4.12",
testRunner : "com.android.support.test:runner:1.0.2",
testEspresso : "com.android.support.test.espresso:espresso-core:3.0.2",
testInstrumentationRunner: "android.support.test.runner.AndroidJUnitRunner"
]
support = [
supportv4 : "com.android.support:support-v4:$sdkVersion.suppertVersion",
appcompatv7: "com.android.support:appcompat-v7:$sdkVersion.suppertVersion",
annotations: "com.android.support:support-annotations:$sdkVersion.suppertVersion",
design : "com.android.support:design:$sdkVersion.suppertVersion"
]
utils = [
kotlin : "org.jetbrains.kotlin:kotlin-stdlib:$sdkVersion.kotlinVersion",
okhttp : "com.squareup.okhttp3:okhttp:$sdkVersion.okhttpVersion",
okhttplog : "com.squareup.okhttp3:logging-interceptor:$sdkVersion.okhttpVersion",
retrofit2 : "com.squareup.retrofit2:retrofit:$sdkVersion.retrofit2Version",
retrofit2gson : "com.squareup.retrofit2:converter-gson:$sdkVersion.retrofit2Version",
retrofit2converter: "com.squareup.retrofit2:converter-scalars:$sdkVersion.retrofit2Version",
retrofit2adapter : "com.squareup.retrofit2:adapter-rxjava2:$sdkVersion.retrofit2Version",
retrofiturlmanager: "me.jessyan:retrofit-url-manager:1.4.0",
rxjava2 : "io.reactivex.rxjava2:rxjava:2.1.16",
rxbus : "com.blankj:rxbus:1.5",
rxandroid2 : "io.reactivex.rxjava2:rxandroid:2.0.2",
rxlifecycler2 : "com.trello.rxlifecycle2:rxlifecycle-components:2.2.1",
multidex : "com.android.support:multidex:1.0.3",
utils : "com.blankj:utilcode:1.23.2",
baseadapter : "com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.40",
glide : "com.github.bumptech.glide:glide:$sdkVersion.glideVersion",
bugly : "com.tencent.bugly:crashreport:2.6.6.1",
imagepreview : "com.ycjiang:ImagePreview:2.2.2",
crash : "cat.ereza:customactivityoncrash:2.2.0",
matisse : "com.zhihu.android:matisse:0.5.2-beta4",
ucrop : "com.github.yalantis:ucrop:2.2.2",
luban : "top.zibin:Luban:1.1.8"
]
widget = [
cardview : "com.android.support:cardview-v7:$sdkVersion.suppertVersion",
recyclerview : "com.android.support:recyclerview-v7:$sdkVersion.suppertVersion",
constraintlayout : "com.android.support.constraint:constraint-layout:1.1.3",
flycotablayout : "com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar",
banner : "com.youth.banner:banner:1.4.10",
smartrefreshlayout: "com.scwang.smartrefresh:SmartRefreshLayout:1.0.5.1",
swipelayout : "com.daimajia.swipelayout:library:1.2.0@aar",
materialedittext : "com.rengwuxian.materialedittext:library:2.1.4"
]
compiler = [
glide: "com.github.bumptech.glide:compiler:$sdkVersion.glideVersion"
]
release = [
leakcanarynoop: "com.squareup.leakcanary:leakcanary-android-no-op:$sdkVersion.leakCanaryVersion"
]
debug = [
leakcanary : "com.squareup.leakcanary:leakcanary-android:$sdkVersion.leakCanaryVersion",
leakcanaryfragment: "com.squareup.leakcanary:leakcanary-support-fragment:$sdkVersion.leakCanaryVersion"
]
utilsLib = utils.values()
supportLib = support.values()
widgetLib = widget.values()
compilerLib = compiler.values()
releaseLib = release.values()
debugLib = debug.values()
}
一些工具类
AlbumNotifyHelper
通知相册刷新图片 一般来说是在下载图片之后 找不到 可以在相册里发现
refresh(File file)
refresh(String filePath)
ApplicationHelper
检查一些常用的App是否存在
isWeChatAvailable
isQQAvailable
isGaodeMapAvailable
isBaiduMapAvailable
isTencentMapAvailable
ClickHelper
防止点击过快 可以在所有的点击事件中添加判断
boolean isNotFastClick
boolean isNotFastLongClick
GlideImageHelper Glide图片加载
MediaHelper
安卓6.0一下获取了权限 但是有系统软件拦截 导致不能录制音视频造成的问题 比如Vivo的爱管家 比如魅族
boolean isAudioUsable
boolean isCameraUsable
ViewHelper
判断控件是否可见 不可见 消失
setVisible(View... views)
setInvisible(View... views)
setGone(View... views)
isVisible(View... views)
isInVisible(View... views)
isGone(View... views)
KeyboardHelper
抽出软键盘帮助 点击空白处隐藏软键盘 在BaseActivity dispatchTouchEvent方法中调用
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
if (isClickBlankHideKeyboard) {
KeyboardHelper.clickBlank2HideKeyboard(this, currentFocus, ev)
}
return super.dispatchTouchEvent(ev)
}
DimenGenerator 最小宽度限定适配的资源文件生成器
运行
DateExt 对于时间的格式化
fun String.toMills(format: String = "yyyy-MM-dd HH:mm:ss")
fun Long.toDate(format: String = "yyyy-MM-dd HH:mm:ss")
fun Long.toDateSec()
fun Long.toDateMin()
fun Long.toDateDay()
FragmentExt
/**
* 在Activity中进行Fragment的增加 显示 隐藏 显示隐藏 替换 移除
*/
fun FragmentActivity.add(layoutId: Int, fragment: Fragment)
fun FragmentActivity.show(fragment: Fragment)
fun FragmentActivity.hide(fragment: Fragment)
fun FragmentActivity.showHide(showFragment: Fragment, hideFragment: Fragment)
fun FragmentActivity.replace(layoutId: Int, f: Fragment)
fun FragmentActivity.remove(f: Fragment)
/**
* 在Fragment中进行Fragment的增加 显示 隐藏 显示隐藏 替换 移除
*/
fun Fragment.add(layoutId: Int, fragment: Fragment)
fun Fragment.hide(fragment: Fragment)
fun Fragment.show(fragment: Fragment)
fun Fragment.showHide(showFragment: Fragment, hideFragment: Fragment)
fun Fragment.replace(layoutId: Int, f: Fragment)
fun Fragment.remove(f: Fragment)
GsonExt
/**
* 实体类转化为json
*/
fun Any.parse2Json()
/**
* json转化为Bean
*/
inline fun <reified T> String.parse2Bean()
/**
* json转为Array
*/
inline fun <reified T> String.parse2Array(Clazz: Class<Array<T>>)
ResourceExt
/**
* 从Context中获取资源
*/
fun Context.color(id: Int)
fun Context.string(id: Int): String
fun Context.stringArray(id: Int): Array<String>
fun Context.drawable(id: Int)
fun Context.dimen(id: Int)
fun Context.dp2px(dp: Float): Int
fun Context.px2dp(px: Float): Int
fun Context.sp2px(sp: Float): Int
fun Context.px2sp(px: Float): Int
···
SharedPreferencesExt
fun Any.SharedPreferences(name: String = BuildConfig.APPLICATION_ID) = BaseApplication.app.getSharedPreferences(name, Context.MODE_PRIVATE)
···
StringExt
fun String.isPhone()
fun String.isEmail()
fun String.isIDCard()
fun String.isChinese()
fun String.md5()
fun String?.isNull()
ViewExt
fun View.height(height: Int)
fun View.limitHeight(min: Int, max: Int)
fun View.width(width: Int)
fun View.limitWidth( min: Int, max: Int)
fun View.widthAndHeight(width: Int, height: Int)
fun View.margin()
fun View.visible()
fun View.gone()
fun View.invisible()
fun View.setVisible(visibleOrGone: Boolean)
val View.isGone
val View.isVisible
val View.isInvisible
fun View.toBitmap(): Bitmap
fun View.onClick(method: () -> Unit)
日后继续添加
Base
这里主要是封装了一些基础的东西,一般来说都要自己写一个BaseActivity,BaseFragment和BaseApplication来继承这些,然后在进行自己的一些操作
一些自定义的东西
BaseBottomDialog
一个底部弹窗的基类,通过继承BaseBottomDialog
bindLayoutRes返回布局文件id
bindView(View mRootView)通过根布局获取到各个控件进行点击事件等等操作
RecyclerView
这两个配套 纵向RootRecyclerView 嵌套横向ChildRecyclerView 让滑动体验更好一点
RootRecyclerView
ChildRecyclerView
用于设置各种各样的分割线
RecyclerViewDivider
设置不可滑动的线性布局和网格布局 一般用于同向的RecyclerView嵌套RecycleView, NestScollView嵌套RecyclerView
NoScrollLinearLayoutManager
NoScrollGridLayoutManager
滑动停止的时候 起始边对齐
StartSnapHelper
NestedScrollView
判NestedScrollView的滑动状态
StateScrollView
ViewPager
设置ViewPager是否可以进行滑动
ScrollViewPager
TextView
中英文混排 支持左中右三种对齐方式
AlignTextView
WeakHandler
使用WeakHandler防止内存泄漏
SimpleAnimationListener
SimpleTextWatcher
and so on
日后继续添加
11月14日 第一次编辑 今天才开始进行总结 有点晚了 总比没有好吧 写给自己 加油吧
11月15日 添加AlignTextView 支持中英文混排 左中右三种对齐方式
11月16日 添加KeyboardHelper 在dispatchTouchEvent中添加 用于点击空白处隐藏软键盘 其他可见 KeyboardUtils方法更全
12月20日 添加BaseBottomDialog 基础的底部弹窗控件
1月3日 添加了自己使用的retrofit+Rxjava网络框架 注意!!!使用的时候需要更具自己的需求进行修改
1月5日 添加了最小宽度限定的适配方案 添加资源生成文件( 删除androidautosize框架)
1月29日 添加Kotlin的拓展工具,修改网络请求使用RetrofitUrlManager,更新自己的MVP套路模版 添加SimpleTextWatcher,在demo中添加了更换BaseUrl的网络请求例子
写给有缘人 如果看到这里 你也是累了 推荐一个超级大礼包 说不定为你开启新世界的大门 github 6K+Star
网友评论