Jenly-AndroidKTX

Kotlin 工具类集合
授权协议 Apache
开发语言 Kotlin
所属分类 手机/移动开发、 手机开发工具
软件类型 开源软件
地区 国产
投 递 者 林和畅
操作系统 Android
开源组织
适用人群 未知
 软件概览

AndroidKTX 一个简化 Android 开发的 Kotlin 工具类集合,通过 Kotlin 语法特性封装一些好用的方法和功能,可以使代码更加简洁易读,从而有效的提高开发效率。

引入

Gradle:

  1. 在Project的 build.gradle 里面添加远程仓库
allprojects {
    repositories {
        //...
        mavenCentral()
    }
}
  1. 在Module的 build.gradle 里面添加引入依赖项
// core-ktx(*必须)
implementation 'com.github.jenly1314.AndroidKTX:core-ktx:1.0.0'
// activity-ktx(可选)
implementation 'com.github.jenly1314.AndroidKTX:activity-ktx:1.0.0'
// fragment-ktx(可选)
implementation 'com.github.jenly1314.AndroidKTX:fragment-ktx:1.0.0'

示例

下面介绍一些部分常用的功能:

ActivityResultCaller 的 ActivityResultLauncher 使用示例(常在 Activity  Fragment 中使用)

    // 单个权限申请:只需在需要使用的地方调用:cameraPermissionLauncher.launch() 即可触发回调
    private val cameraPermissionLauncher = requestPermissionLauncher(Manifest.permission.CAMERA) { granted ->
        showToast("granted = $granted")
        log(msg = "granted = $granted")
        if (granted) {
            // 已授权,则进行拍照预览
            picturePreviewLauncher.launch()
        }
    }
    
    // 多个权限申请:只需在需要使用的地方调用:readWritePermissionLauncher.launch() 即可触发回调
    private val readWritePermissionLauncher = requestMultiplePermissionsLauncher(
        arrayOf(
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
        )
    ) { allGranted, grantedPermissions, deniedPermissions ->
        showToast("allGranted = $allGranted")
        log(msg = "allGranted = $allGranted, grantedPermissions = $grantedPermissions, deniedPermissions = $deniedPermissions")
        if (allGranted) {
            // 已全部授权,则进行选择文件
            documentLauncher.launch()
        }
    }
    
    // 拍照预览
    private val picturePreviewLauncher = takePicturePreviewLauncher{
        binding.iv.setImageBitmap(it)
    }
    
    // 选择文件 (类型:image/*)
    private val documentLauncher = openDocumentLauncher(arrayOf("image/*")){
        binding.iv.setImageURI(it)
    }
    
    // startActivityForResult:只需在需要使用的地方调用:startActivityLauncher.launch(intent) 即可触发回调
    private val startActivityLauncher = startActivityForResultLauncher{
        log(msg = "resultCode = ${it.resultCode}")
        if(it.isResultOk()){
            // 成功
            showToast("Result Ok")
        }else{
            showToast("Result Cancel")
        }
    }
 

然后通过申明的 XXXLauncher 调用函数 launch 即可

    // 如:cameraPermissionLauncher
    cameraPermissionLauncher.launch()
 
    //如:startActivityLauncher
    startActivityLauncher.launch(
            intentOf(
                SampleActivity::class.java,
                "key1" to 2,
                "key2" to "Start Activity For Result"
            )
        )
 

startActivity 使用示例(常在 Activity  Fragment 中使用)

    // 相当于 startActivity(Intent(this, MainActivity::class.java))
    startActivity<MainActivity>()
 

    // 相当于 startActivity(Intent(this, MainActivity::class.java))
    startActivity(MainActivity::class.java)
 

或(带传递参数)

    // 相当于 startActivity(Intent(this, MainActivity::class.java).putExtra("key1", 1).putExtra("key2", "Start Activity")
    startActivity(SampleActivity::class.java, "key1" to 1, "key2" to "Start Activity")
 

然后在跳转后的界面接收数据

class SampleActivity : AppCompatActivity(R.layout.activity_sample) {

    // 懒加载:相当于懒加载的方式获取 getIntent().getExtras().get("key1"); 类型为:Int(有默认值,可保证不为空,并通过默认值的类型可自动推断出变量的类型)
    private val extra1 by lazyIntentExtra("key1", 0)

    // 属性委托:相当于 getIntent().getExtras().get("key2"); 类型为:String(有默认值,可保证不为空)
    private val extra2 by intentExtra("key2", "")


}
 

Intent 的 intentExtra 使用示例(常在 Activity 中使用)

    // 属性委托:相当于 getIntent().getExtras().get("extra1"); 类型为:Int?
    private val extra1: Int? by intentExtra<Int>("extra1")
    
    // 属性委托:相当于 getIntent().getExtras().get("extra2"); 类型为:Int?(有申明类型时,可以省略泛型)
    private val extra2: Int? by intentExtra("extra2")
    
    // 属性委托:相当于 getIntent().getExtras().get("extra3"); 类型为:Int?(有声明泛型时,可以省略类型)
    private val extra3 by intentExtra<Int>("extra3")
    
    // 属性委托:相当于 getIntent().getExtras().get("extra4"); 类型为:Int(有默认值,可保证不为空)
    private val extra4: Int by intentExtra("extra4", 1)
    
    // 属性委托:相当于 getIntent().getExtras().get("extra5"); 类型为:Int(有默认值,通过默认值的类型可自动推断出变量的类型)
    private val extra5 by intentExtra("extra5", 1)
    
    // 属性委托:相当于 getIntent().getExtras().get("extra6"); 类型为:Int(key的默认值如果忽略或为空时,则默认值为变量的名称)
    private val extra6 by intentExtra(defaultValue = 1)
    
    // 属性委托:相当于懒加载的方式获取 getIntent().getExtras().get("extra7"); 类型为:Int?
    private val extra7: Int? by intentExtra()
    
    // 懒加载:相当于懒加载的方式获取 getIntent().getExtras().get("extra8"); 类型为:Int?
    private val extra8: Int? by lazyIntentExtra("extra8")
    
    // 懒加载:相当于懒加载的方式获取 getIntent().getExtras().get("extra9"); 类型为:Int(有默认值,可保证不为空,并通过默认值的类型可自动推断出变量的类型)
    private val extra9 by lazyIntentExtra("extra9", 1)
 

Fragment 的 argument 使用示例(常在 Fragment 中使用)

    // 属性委托:相当于 fragment.getArguments().get("arg1"); 类型为:Int?
    private val arg1: Int? by argument<Int>("arg1")

    // 属性委托:相当于 fragment.getArguments().get("arg2"); 类型为:Int?(有申明类型时,可以省略泛型)
    private val arg2: Int? by argument("arg2")

    // 属性委托:相当于 fragment.getArguments().get("arg3"); 类型为:Int?(有声明泛型时,可以省略类型)
    private val arg3 by argument<Int>("arg3")

    // 属性委托:相当于 fragment.getArguments().get("arg4"); 类型为:Int(有默认值,可保证不为空)
    private val arg4: Int by argument("arg4", 1)

    // 属性委托:相当于 fragment.getArguments().get("arg5"); 类型为:Int(有默认值,通过默认值的类型可自动推断出变量的类型)
    private val arg5 by argument("arg5", 1)

    // 属性委托:相当于 fragment.getArguments().get("arg6"); 类型为:Int(key的默认值如果忽略或为空时,则默认值为变量的名称)
    private val arg6 by argument(defaultValue = 1)

    // 属性委托:相当于懒加载的方式获取 fragment.getArguments().get("arg7"); 类型为:Int?
    private val arg7: Int? by argument()

    // 懒加载:相当于懒加载的方式获取 fragment.getArguments().get("arg8"); 类型为:Int?
    private val arg8: Int? by lazyArgument("arg8")

    // 懒加载:相当于懒加载的方式获取 fragment.getArguments().get("arg9"); 类型为:Int(有默认值,可保证不为空,并通过默认值的类型可自动推断出变量的类型)
    private val arg9 by lazyArgument("arg9", 1)
 

argument 主要使用场景示例

    class SampleFragment : Fragment() {
        
        // 属性委托的方式传递参数
        private var argInt by argument(defaultValue = 0)
        private var argString: String? by argument()
        private var argBool by argument(defaultValue = false)
        
        companion object {
    
            fun newInstance(argInt: Int, argString: String, isBool: Boolean): SampleFragment {
                return SampleFragment().apply {
                    // 示例:属性委托的方式传递参数
                    this.argInt = argInt
                    this.argString = argString
                    this.argBool = isBool
                }
            }
        }
        
        //...
        
    }
 

 

 相关资料
  • 有时候你需要实现自己的集合扩展。也许你想要在元素被添加到列表时增加特定的行为,或者你想实现一个Iterable,其底层实际上是遍历数据库查询的结果集。Guava提供了若干工具方法,以便让类似的工作变得更简单。 Forwarding Decorators 针对所有类型的集合接口,Guava都提供了Forwarding抽象类以简化装饰者模式的使用。 Forwarding抽象类定义了一个抽象方法:del

  • Guava提供了很多类似java.util.Collections的静态工具类 Guava中工具类与集合的对应关系如下: 集合接口 来自于JDK/Guava 对应的Guava工具类 Collection JDK Collections2 List JDK Lists Set JDK Sets SortedSet JDK Sets Map JDK Maps SortedMap JDK Maps Qu

  • 本文向大家介绍java拓展集合工具类CollectionUtils,包括了java拓展集合工具类CollectionUtils的使用技巧和注意事项,需要的朋友参考一下 拓展集合工具类CollectionUtils,供大家参考,具体内容如下 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 1. Collections工具类 Collections类概述 针对集合操作 的工具类,里面的方法都是静态的,可以对集合进行排序、二分查找、反转、混排等。 Collection和Collections的区别 Collection:是单列集合的顶层接口,有子接口List和Set。Collections:是针对集合操作的工具类,有对集合进行排序和二分查找等方法 Collections常用方法 pub

  • ML Kit是一个能够将谷歌专业的机器学习知识带到应用中的极其简单易用的封装包。无论您是否有机器学习的经验,您都可以在几行代码中实现您想要的功能。甚至,您无需对神经网络或者模型优化有多深入的了解,也能完成您想要做的事情。 基于现有的API您可以很轻松的实现文字识别、条码识别、图像标记、人脸检测、对象检测等功能;另一方面,如果您是一位经验丰富的ML开发人员,ML kit甚至提供了便利的API,可帮助

  • JavaFieldGenerator 是一个可以根据字符串内容快速生成Java字段的插件。 在日常开发的过程中,常常会根据接口文档去定义一些JavaBean,而接口文档的请求和响应相关信息,在大部分情况下都是使用表格的形式列出相关的字段信息,每次无脑式的对着文档的字段信息去定义对应的JavaBean就略显无聊。 如果这时我们使用了 JavaFieldGenerator 插件,就可以快速根据定义的字