美文网首页
写一个适合自己的iFramex

写一个适合自己的iFramex

作者: 周大侠侠侠侠侠侠侠侠侠侠侠侠侠 | 来源:发表于2018-11-15 14:27 被阅读0次

超时空传送门 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中

给自己的提示:需要使用的时候把项目拉下来,看下是如何配置的,因为会经常修改
一些常见的错误提示都写在笔记里了注意看




下面的内容不推荐使用了 还是太年轻 写的很乱

GitHub 超时空传送门

基础依赖

这里依赖的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

相关文章

  • 写一个适合自己的iFramex

    超时空传送门 https://github.com/zmemo/iFramex 版本:androidxtarget...

  • 写适合自己的文风

    莫言说 “我写不出城市题材的小说, 我只能写农村题材的小说。因为我出生在农村。” 可见 ,写作也不能追风。只写自己...

  • 寻找适合自己的

    本周简书想写一下,寻找适合自己的。填入适合自己的实物、工作或是人。 1、寻找适合自己的爱人 如何寻找适合自己的爱人...

  • 天桥沟国家森林公园

    自从每天开始写500字,真心感觉简书是一个比较适合的平台,上传的都是自己拍的照片,每天也是根据不同的心境写自己想写...

  • 享受写文,踏着适合自己的节拍

    减肥,是女人永远绕不开的话题。当真是胖的想瘦,瘦的还想再瘦!然则何时而乐耶?其必曰:瘦到不能再瘦! 于是乎,各类减...

  • 写不好,还写不坏吗?

    你有没有这种感觉,有时候会认为自己写的不好而怀疑自己是不是不适合写作。看到一个比较有趣的观点:你写不好,还写不坏吗...

  • 知错改错(25)

    写了三四年,终于找到一个适合自己写的系列,决定写一千篇,甚至更多。写此的目的是活出生命的质量,通过寻找自身的过失,...

  • 2

    恋爱,是选择一个适合自己的人,而不是把一个不适合自己的人改造成适合自己的模样。

  • 一个适合自己的衣柜

    主卧没有打成品衣柜,每次换季都因为需要“成全”家里的某个布局,而“牺牲”掉这块空间。循环往复,每年如此。当然,也是...

  • 如何选择适合自己的书单写拆书稿

    拆书稿是目前写作最容易上手的一种文体,同时也是需求量比较大的一个市场。竞争越来越激烈的时代,知识就是生产力,懂得越...

网友评论

      本文标题:写一个适合自己的iFramex

      本文链接:https://www.haomeiwen.com/subject/ikdyfqtx.html