美文网首页
DLTool解决MVP、Http、UI、Util、高效扫码等问题

DLTool解决MVP、Http、UI、Util、高效扫码等问题

作者: 英勇的骑士_d175 | 来源:发表于2021-03-30 11:12 被阅读0次
    DLTool是我个人过去这些年用着效果最好最顺手的代码和控件进行的合辑,可以大大缩减开发时间,下面直接进入干货。

    DLTool gitee地址

    1. 使用方法:

    Step1

    allprojects {
            repositories {
                ...
                maven { url 'https://jitpack.io' }
            }
        }
    

    Step2

        dependencies {
                implementation 'com.gitee.toune.DLTool:DLTools:v1.0.8'
        }
    
    

    Step3

    将minSdkVersion版本设置为19
    minSdkVersion 19
    

    Step4

    自定义APP的onCreate中添加如下代码进行初始
    
            DLTool.init(this)
    

    注意

    如果报:Cannot fit requested classes in a single dex file (# methods: 71623 > 65536)异常
    解决办法:
    
    1、在app model中的build.gradledependencies里面添加:
    
        implementation 'androidx.multidex:multidex:2.0.0'
    
    
    2、app model中的build.gradle文件的defaultConfig默认配置里面增加:
    multiDexEnabled true
    
    android {
        compileSdkVersion 29
        defaultConfig {
            applicationId "com.toune.dltool"
            minSdkVersion 19
            targetSdkVersion 29
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            multiDexEnabled true
        }
    
    
    3.最后在自定义了Application子类,需要在这个子类中重写一个方法
    
        // 主要是添加下面这句代码
        MultiDex.install(this);
        
        override fun attachBaseContext(base: Context?) {
            super.attachBaseContext(base)
            MultiDex.install(base)
        }
        
    

    2.一键MVP使用

    使用说明

    以MainActivity为例

    • 创建MainActivityView继承DLBaseView
    interface MainActivityView:DLBaseView {
      //View持有类
    }
    
    • 创建MainActivityPresenter继承DLBasePresenterImpl
    class MainActivityPresenter:DLBasePresenterImpl<MainActivityView>() {
      //presenter持有类,业务和接口请求存放类
    }
    
    • 创建MainActivity继承DLBaseActivity
    class Main:DLBaseActivity<MainActivityView,MainActivityPresenter>(),MainActivityView {
        override val layout: Int
            get() = R.layout.activity_main  //布局文件
        override val titleStr: String?
            get() = "首页"  //页面标题,返回""或者null则不显示
    
        override fun initPresenter(): MainActivityPresenter {
            return MainActivityPresenter()  //返回当前presenter
        }
    
        override fun init(savedInstanceState: Bundle?) {
            //业务逻辑
        }
    
        override fun initEventAndData() {
            //监听事件
        }
    }
    
    • DLBaseActivity类详细使用方法解析

    1.显示用户隐私协议弹框

        /**
         * 显示用户隐私协议弹框
         * 直接使用自己的dialog
         */
        @RequiresApi(Build.VERSION_CODES.M)
        fun showUserPrivacyDialog(dialog: Dialog) {
            if (!DLPermissionUtil.isAppFirst(this)) {
                dialog.setCanceledOnTouchOutside(false)
                dialog.show()
            }
        }
    
        /**
         * 显示用户隐私协议弹框
         * 用默认的,设置contentSpan就行
          * @params permissions 进入APP或者首页需要请求的权限
         */
        @RequiresApi(Build.VERSION_CODES.M)
        fun showUserPrivacyDialog(contentSpan: SpannableStringBuilder?, vararg permissions: String) {
            if (!DLPermissionUtil.isAppFirst(this)) {
                showUserPrivacy(contentSpan, *permissions)
            }
        }
    
    /**
    * 隐私协议同意方法,可以重写此方法,填写自己的逻辑
    */
        open fun userPrivacySureClick(){
    
        }
    
    使用示例:
        override fun init(savedInstanceState: Bundle?) {
            super.init(savedInstanceState)
            var contentSpan = createSpan()
            showUserPrivacyDialog(contentSpan)
        }
    
          private fun createSpan(): SpannableStringBuilder? {
            var firstStr = "1.您将使用${resources.getString(R.string.app_name)}App,使用${resources.getString(R.string.app_name)}App需要建立网络数据连接,产生的流量费请咨询当地运营商,点击“同意”接受"
            var userStr = "《用户协议》"
            var andStr = "和"
            var yinsiStr = "《隐私政策》"
            var endStr = ",浏览以上协议政策需要联网\n" +
                    "2.为了保证您的正常使用,在使用过程中,${resources.getString(R.string.app_name)}App需要获取以下权限;访问网络,获取储存空间、设备信息、获取位置等权限。\n" +
                    "这些权限${resources.getString(R.string.app_name)}APP并不会默认开启,只有用户同意并授权后才会生效;未经授权我们不会收集、处理或泄露您的个人信息"
            var firstSpan = SpannableStringBuilder(firstStr)
            var userSpan = SpannableStringBuilder(userStr)
            var andSpan = SpannableStringBuilder(andStr)
            var yinsiSpan = SpannableStringBuilder(yinsiStr)
            var endSpan = SpannableStringBuilder(endStr)
            val colorSpan = ForegroundColorSpan(Color.parseColor("#108EE9"))
            userSpan.setSpan(colorSpan, 0, userSpan.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            val userClickableSpan: ClickableSpan = object : ClickableSpan() {
                override fun onClick(view: View) {
                    var bundle = Bundle()
                    bundle.putString("title", userStr)
                    bundle.putString("url", "http://www.baidu.com")
                    DLActivityTool.skipActivity(context, DLWebActivity::class.java, bundle)
                }
            }
            userSpan.setSpan(
                userClickableSpan,
                0,
                userSpan.length,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            )
    
            yinsiSpan.setSpan(colorSpan, 0, yinsiSpan.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
            val clickableSpan: ClickableSpan = object : ClickableSpan() {
                override fun onClick(view: View) {
                    var bundle = Bundle()
                    bundle.putString("title", yinsiStr)
                    bundle.putString("url", "http://www.baidu.com")
                    DLActivityTool.skipActivity(context, DLWebActivity::class.java, bundle)
                }
            }
            yinsiSpan.setSpan(
                clickableSpan,
                0,
                yinsiSpan.length,
                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
            )
            firstSpan.append(userSpan).append(andSpan).append(yinsiSpan).append(endSpan)
            return firstSpan
        }
    

    2.用户此页面需要获取的权限

     /**
         * 设置这个页面需要请求的权限
         */
        @RequiresApi(Build.VERSION_CODES.M)
        fun showPermission(vararg permissions: String) {
            DLPermissionUtil.with(this).showPermissionDialog(*permissions)
        }
    
        /**
         * 显示用户隐私协议弹框
         */
        @RequiresApi(Build.VERSION_CODES.M)
        fun showPermission(onGrantedListener: OnGrantedListener, vararg permissions: String) {
            DLPermissionUtil.with(this).setOnGrantedClickListener(onGrantedListener)
                .showPermissionDialog(*permissions)
        }
    
    使用示例:
       override fun initEventAndData() {
    //        DLSPTool.putBoolean(context,DLPermissionUtil.APP_FIRST,true) //可以用这段代码默认用户已经同意了隐私协议
            showPermission(Manifest.permission.INTERNET,
                Manifest.permission.ACCESS_WIFI_STATE,
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.READ_EXTERNAL_STORAGE,
                BACKGROUND_LOCATION_PERMISSION,
                Manifest.permission.FOREGROUND_SERVICE
            )
    }
    

    3.为标题栏增加控件

     /**
         * 使用默认的title才生效
         * @param view View
         */
        fun addRightView(view: View) {
            if (DLActivityConfig.useDefaultTitleView) {
                (mTitleRootView as DLBaseTitleView).addRightView(view)
            }
        }
    
    使用示例:
      var rv = View.inflate(context,R.layout.layout_xxx,null)
                    var rightTv = rv.findViewById<TextView>(R.id.tv)
                    addRightView(rv)
                    rightTv.setOnClickListener {
                        //点击事件
                    }
    

    4.更换标题

     /**
         * 使用默认的title才生效
         * @param string String
         */
       fun setTitleStr(string: String?) {
            mTitleRootView!!.setTitleStr(string)
        }
    

    5.Activity跳转

    /**
         * 本Activity进行的跳转
         * @param clazz Class<Any>
         */
        fun startToActivity(clazz :Class<Any>){
            DLActivityTool.skipActivity(this,clazz)
        }
    
        /**
         * 本Activity进行的带参数跳转
         * @param clazz Class<Any>
         * @param bundle Bundle
         */
        fun startToActivity(clazz :Class<Any>,bundle: Bundle){
            DLActivityTool.skipActivity(this,clazz,bundle)
        }
    

    6.显示loading和隐藏loading

    //显示
    showLoading()
    //隐藏
    hideLoading()
    

    7.设置本页面需要点击两次返回键才能退出,主要是首页用

    isSignOut = true
    
    • DLTool初始化一些全局参数设置

            DLTool.init(this)
                    //设置DLBaseActivity
                .setActivityConfig(
                    DLActivityConfig.Builder()
                    .setLoadingColor(Color.YELLOW)   //设置loading的颜色
                    .setLoadingXml(R.layout.layout_loading_xml)  //设置loading的布局文件
                    .setCustomTitleView(CustomTitleView())  //设置自定义的标题栏
                    .setDefaultTextGravity(Gravity.CENTER_VERTICAL) //设置默认标题栏的标题位置
                    .setDefaultTitleBgColor(Color.BLUE)//设置默认标题栏的背景颜色
                    .setDefaultTextColor(Color.WHITE)//设置默认标题栏的字体颜色
                )
                    //开启异常抓取,防止APP崩溃
                .openCrash()
                    //设置http基本参数
                .setHttpConfig(
                    DLHttpConfig.setDataStr("status","msg","data")//设置http的字段名称
                        .setSuccessCode(200)//设置正确码
                        .setErrorCode(100)//设置错误码
                )
                    //设置自定义字体
                .setCustomFont("")
    

    相关文章

      网友评论

          本文标题:DLTool解决MVP、Http、UI、Util、高效扫码等问题

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