美文网首页
写一个适合自己的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://www.haomeiwen.com/subject/ikdyfqtx.html