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

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() {
  //presenter持有类,业务和接口请求存放类
}
  • 创建MainActivity继承DLBaseActivity
class Main:DLBaseActivity(),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(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
     */
    fun startToActivity(clazz :Class){
        DLActivityTool.skipActivity(this,clazz)
    }

    /**
     * 本Activity进行的带参数跳转
     * @param clazz Class
     * @param bundle Bundle
     */
    fun startToActivity(clazz :Class,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、高效扫码等问题(一))