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("")