10 个对于Android开发者有用的Kotlin扩展函数#1

news2024/12/28 3:46:23

10 个对于Android开发者有用的Kotlin扩展函数

使用扩展函数来提高安卓开发体验
logo

什么是扩展功能?

Kotlin 中的扩展函数允许您向现有类添加新功能,而无需继承它或修改类本身。这是从类定义外部扩展类功能的便捷方式。

Log

您可以any object使用此扩展功能轻松地在 logcat 中编写。您不必担心将任何对象转换为字符串。可以用默认标签写,也可以通过自定义标签在logcat中区分。

import android.util.Log

fun Any?.printToLog(tag: String = "DEBUG_LOG") {
    Log.d(tag, toString())
}

用法

val text = "This is text"
 text.printToLog() 

val user = User( 
    name = "John" , 
    id = 1
 ) 
user.printToLog() // 使用默认日志标签
user.printToLog(tag = "USER_INFO" ) / / 带有自定义日志标签

View#visiable,invisible,gone

在 Android 中,我们总是需要处理视图。因此,很明显,我们必须使用视图可见性来显示或隐藏特定的文本视图、图像视图和任何其他视图。因此,此功能有助于可见性处理。您可以直接将gone()visible()invisible()函数应用于单个操作。

但是,如果您必须处理特定条件下的可见性,则可以使用goneIfvisibleIfinvisibleIf函数。此函数使用中缀表示法的概念来增加代码的可读性。

import android.view.View

fun View.gone() = run { visibility = View.GONE }

fun View.visible() = run { visibility = View.VISIBLE }

fun View.invisible() = run { visibility = View.INVISIBLE }

infix fun View.visibleIf(condition: Boolean) =
    run { visibility = if (condition) View.VISIBLE else View.GONE }

infix fun View.goneIf(condition: Boolean) =
    run { visibility = if (condition) View.GONE else View.VISIBLE }
    
infix fun View.invisibleIf(condition: Boolean) =
    run { visibility = if (condition) View.INVISIBLE else View.VISIBLE }

用法

view.gone() 
view.visible() 
view.invisible() 

// dataFound、loading、condition 应该是有效的布尔表达式
view goneIf dataFound 
view visibleIf loading 
view invisibleIf condition

Toast

Toast,向用户显示消息或发出警告是一件简单的事情。为此,您必须使用 Toast 类的 makeText 函数并传递上下文和其他内容以及使用 show 函数来显示。

因此,此扩展功能允许您简单地传递一条消息,然后您的 toast 就会显示出来。此函数是在 Activity 和 Fragment 范围内创建的。因此,您必须在该范围内使用它。您还可以仅使用字符串 ID 来使用字符串资源文件中的文本。

import android.app.Activity
import android.widget.Toast
import androidx.annotation.StringRes
import androidx.fragment.app.Fragment

fun Fragment.toast(message: String) {
    Toast.makeText(requireContext(), message, Toast.LENGTH_LONG).show()
}

fun Fragment.toast(@StringRes message: Int) {
    Toast.makeText(requireContext(), message, Toast.LENGTH_LONG).show()
}

fun Activity.toast(message: String) {
    Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}

fun Activity.toast(@StringRes message: Int) {
    Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}

用法

toast( "这是Toast消息" ) 
toast(R.string.toast_message)

snackbar

此功能可帮助您在视图顶部显示一个 snackbar 以进行简单的消息显示,并且您还可以根据需要更改持续时间。您必须在视图或根视图上使用此功能。

import android.view.View
import androidx.annotation.StringRes
import com.google.android.material.snackbar.Snackbar

fun View.snackbar(message: String, duration: Int = Snackbar.LENGTH_LONG) {
    Snackbar.make(this, message, duration).show()
}

fun View.snackbar(@StringRes message: Int, duration: Int = Snackbar.LENGTH_LONG) {
    Snackbar.make(this, message, duration).show()
}

用法

rootView.snackbar( "This is snackbar message" ) 
rootView.snackbar(R.string.snackbar_message) 

// 自定义持续时间长度
rootView.snackbar( "This is snackbar message" , duration = Snackbar.LENGTH_SHORT)

hidekeyboard

如果您正在处理用户操作,或者如果您想在任何特定情况下以编程方式隐藏键盘,那么隐藏键盘可能会让人头疼,那么此功能将很有用。您必须简单地调用hideKeyboard()活动或片段范围。

import android.app.Activity
import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.fragment.app.Fragment

fun Activity.hideKeyboard() {
    val imm: InputMethodManager =
        getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
    val view = currentFocus ?: View(this)
    imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

fun Fragment.hideKeyboard() {
    activity?.apply {
        val imm: InputMethodManager =
            getSystemService(Activity.INPUT_METHOD_SERVICE) as InputMethodManager
        val view = currentFocus ?: View(this)
        imm.hideSoftInputFromWindow(view.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
    }
}

用法

hideKeyboard()

dp 和 px 转换

有时,您必须从代码文件中动态修改视图,而不是从 XML 中对其进行修复。例如,您可能必须为特定场景更改视图宽度和高度,或者您必须修改边距或填充。因此,在那种情况下,您必须将像素传递给这些函数。但是您希望根据与密度无关的像素 (dp) 标准有更多的了解。

因此,此属性可帮助您进行px to dp和dp to px转换。您可以简单地使用 px 属性将 dp 转换为 px,并使用 dp 属性将 px 转换为 dp。

import android.content.res.Resources

// Convert px to dp
val Int.dp: Int
    get() = (this / Resources.getSystem().displayMetrics.density).toInt()

//Convert dp to px
val Int.px: Int
    get() = (this * Resources.getSystem().displayMetrics.density).toInt()

用法

params.setMargins( 16.px , 16.px , 16.px , 16.px )

数字及字母检查

此属性允许您检查字符串。当您只想验证数字、字母或字符串文本中的字母数字时,这会很有用。检查示例以获得更多理解。它基于正则表达式。

val String.isDigitOnly: Boolean
    get() = matches(Regex("^\\d*\$"))

val String.isAlphabeticOnly: Boolean
    get() = matches(Regex("^[a-zA-Z]*\$"))

val String.isAlphanumericOnly: Boolean
    get() = matches(Regex("^[a-zA-Z\\d]*\$"))

用法

val isValidNumber = "1234" .isDigitOnly // return true
val isValid = "1234abc" .isDigitOnly // return false
val isOnlyAlphabetic = "abcABC" .isAlphabeticOnly // return true
val isOnlyAlphabetic2 = "abcABC123" .isAlphabeticOnly // return false
val isOnlyAlphanumeric = "abcABC123" .isAlphanumericOnly // return true
val isOnlyAlphanumeric2 = "abcABC@123." .isAlphanumericOnly // return false

isNull

isNull 将应用于任何属性。每当您要检查任何对象的 null 相等性时,都会使用此属性。此属性将增加代码的可读性。您可以使用obj.isNull而不是obj == null

val Any?.isNull get() = this == null

用法

if (obj.isNull) {
    // Run if object is null
} else {
    // Run if object is not null
}

ifNull

如果你想在特定对象为空时运行一些代码怎么办?在这种情况下,通常,您必须使用具有 null 相等性的 if 条件。但是,除此之外,您还可以使用此功能。当该特定对象为空时,它将运行该块。这个概念就像其他作用域函数一样。

fun Any?.ifNull(block: () -> Unit) = run {
    if (this == null) {
        block()
    }
}

用法

obj.ifNull { 
    // Write code
}

日期格式

在 Android 中处理日期时,我们必须对服务器日期和用户可读日期进行一些自定义。为此,我们通常使用辅助函数进行转换。

但是,在这里,我们可以直接在字符串到字符串到日期的转换中应用这个函数,我们可以在日期上使用这个函数来进行日期到字符串的转换。在这里,我已经通过了默认格式。但你可以改变它。您可以根据您的要求传递自定义格式。

import java.text.SimpleDateFormat
import java.util.*

fun String.toDate(format: String = "yyyy-MM-dd HH:mm:ss"): Date? {
    val dateFormatter = SimpleDateFormat(format, Locale.getDefault())
    return dateFormatter.parse(this)
}

fun Date.toStringFormat(format: String = "yyyy-MM-dd HH:mm:ss"): String {
    val dateFormatter = SimpleDateFormat(format, Locale.getDefault())
    return dateFormatter.format(this)
}

用法

val currentDate = Date().toStringFormat()
val currentDate2 = Date().toStringFormat(format = "dd-MM-yyyy")
val date = "2023-01-01".toDate(format = "yyyy-MM-dd")

结论

我希望所提供的扩展函数对简化和优化您的代码很有用。随意修改它们以满足您的个人需求并将它们包含在您的项目中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/583120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ABAQUS】什么是剪切闭锁?剪切闭锁会导致什么?

“完全积分”是指当单元具有规则形状时,对单元刚度矩阵中的多项式项进行精确积分所需的高斯点数。对于六面体和四边形元素,“规则形状”意味着边缘是直的,并以直角相交,任何边缘节点都位于边缘的中点。 完全积分的线性元素在每个…

6种常见电流检测电路设计方案

电流检测电路设计方案(一) 低端检流电路的检流电阻串联到地(图1),而高端检流电路的检流电阻是串联到高电压端(图2)。两种方法各有特点:低端检流方式在地线回路中增加了额外的线绕电…

正则表达式快速上手

一、推荐个正则表达式练习网站:regex101: build, test, and debug regexhttps://regex101.com/ 二、正则表达式常用的几个符号 (一)限定符 1. ?: 表示匹配的字符串中,?前面的字符可有可无&a…

VUE3.0 路由跳转之后页面停留在上一个浏览页面位置不会回到顶部问题

方式一:普通用法,vue2.0也可用 // 一般方式路由拦截 export default {// 组件守护器beforeRouteEnter(to, from, next) {// A跳转到B,B页面停留在A页面的滚动位置;解决方法:将scrollTop设置为0window.scroll(0, 0);ne…

使用docker部署mysql的主从复制

前言: 客户需要数据库做一个备份,所以这次部署mysql的主从复制,由于测试原因两个mysql服务都安装在一台服务器上,实际部署中一般分开部署。 介绍: 用途: 实时灾备,用于故障切换读写分离&…

excel常用操作

1 基础操作 1.1 冻结首行 选中需要冻结的行,视图--冻结窗格,从而使其固定显示。

提权神器:WindowsVulnScan

简介 这是一款基于主机的漏洞扫描工具,采用多线程确保可以快速的请求数据,采用线程锁可以在向sqlite数据库中写入数据避免database is locked的错误,采用md5哈希算法确保数据不重复插入。 它可以实现自动化对目标主机操作系统信息收集&…

【开发者指南】如何在MyEclipse中使用 XML编辑器

XML编辑器包括高级XML编辑功能。通过本文,你将了解其编辑功能和网页XML编辑,一起来看看吧~ 1. Web XML编辑器 MyEclipse Web XML编辑器包括高级XML编辑功能,如: 语法高亮显示标签和属性内容辅助实时验证(在您输入时)文档内容的源视图、设计…

图像增强算法(直方图均衡化、拉普拉斯、Log、伽马变换)

https://www.cnblogs.com/polly333/p/7280764.html https://www.cnblogs.com/polly333/p/7280764.html https://www.cnblogs.com/polly333/p/7280764.html 一、图像增强算法原理 图像增强算法常见于对图像的亮度、对比度、饱和度、色调等进行调节,增加其清晰度&a…

LinuxShell编程

Shell编程 Shell的概念介绍 命令解释器 Shell是命令解释器(command interpreter),是Unix操作系统的用户接口,程序从用户接口得到输入信息,shell将用户程序及其输入翻译成操作系统内核(kernel)能够识别的指令&#x…

【音视频处理】H264/H265详解,为什么H264更常用?

大家好,欢迎来到停止重构的频道。 本期我们介绍视频编码格式H264。 H264是视频画面最常用的编码格式了,几乎所有的播放器都支持这个编码格式,当然浏览器也不例外。 我们按这样的顺序讨论H264 : 1、 编码格式的作用 2、 I帧…

4:File类与IO流

文章目录 File类1:引入:2:对文件进行操作3:对目录/文件夹进行操作 IO流1:引入:2:字符输入 / 出流FileReader 与 FileWriter3:用try - catch - finally 处理异常4:几个常见…

易趋受邀出席CIAS 2023中国数智汽车峰会

2023年5月18日-19日,由中国电子商会、中国汽车信息化推进产业联盟、信息侠联合主办,上海市交通工程协会、 浙江省数字经济联合会联合支持的CIAS 2023第二届中国数智汽车峰会在杭州千岛湖顺利召开。易趋受邀出席此次会议,并发表了主题演讲。 &…

软件架构: 一切皆有代价

软件架构必须随着业务发展而演进,否则就会成为业务的阻碍。但架构本身在发展过程中很容易逐渐腐化,堆积大量技术债务,因此在软件发展过程中始终保持架构愿景非常重要。原文: Software architecture — Paying the Price for Neglecting it 在…

数组的玩法比我以为的要多

数组是最基本的数据结构,关于数组的面试题也屡见不鲜,本文罗列了一些常见的面试题,仅供参考。目前有以下18道题目。 数组求和 求数组的最大值和最小值 求数组的最大值和次大值 求数组中出现次数超过一半的元素 求数组中元素的最短距离 求…

2023.05.28 homework

求三角形最长的边的长度 1)任意两边之和大于第三边; 2)任意两边之差小于第三边; 已知最短边13cm,其他两边肯定都等于大于13cm,两边只差肯定要小于13cm;简单推导就是枚举呗。 13cm 14cm 33cm&a…

web --- javascript(01)-- 介绍、变量和数据类型

JavaScript w3c:三层分离 结构层:HTML 表示层:CSS 行为层:JavaScript 介绍 (1)作用: 数据校验网页特效数据交互服务器端编程(NodeJS) (2)javas…

【PS小贴士】PS项目交货(CNS0/VL02N)-和销售订单交货(VL01N/VL02N)的区别点

目前一家公司在进行企业信息化建设,作为PS顾问有幸参与到其中。真是做的项目越来越多,经历的人越来越多,每个项目的感触也不同。不论是方案,还是项目上一起努力的小组成员、以及项目组顾问。哈哈哈哈哈哈哈哈...... 同样&#xf…

Linux 系统上的库文件生成与使用

1.库文件 库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在:/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在 /usr/include 下或其子目录下。 库有两种,一种是静态库,其…

分享几个国内免费可用的ChatGPT镜像【无需梯子】

文章目录 1.什么是ChatGPT2.ChatGPT的基础技术3.ChatGPT工作原理4.ChatGPT应用场景5.ChatGPT局限性6.ChatGPT的未来发展7.国内免费ChatGPT镜像写在最后 ChatGPT国内能用吗:ChatGPT在国内是无法使用的。你肯定要问我怎样才能体验到ChatGPT的神奇魔力呢?文…