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

news2024/12/24 2:40:35

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

通过出色的 Kotlin 扩展提高您的工作效率
logo

EditText

通过EditText的“text”属性,您可以快速获取EditText中的文本。但是,这个文本是“可编辑”的,因此每次都需要将其转换为字符串才能获得EditText的准确值。但好消息是,您可以使用下面列出的扩展属性轻松获取EditText的值。

import android.widget.EditText

val EditText.value
    get() = text?.toString() ?: ""

用法

val name = etName.value

startActivity

Start Activity 是转换到另一个 Activity 的常用方法。您必须首先解决目标活动的意图。但是,通过使用此扩展功能,您可以消除意图创建部分。

您还可以自定义传递一些数据和其他内容的意图。如果需要,它还可以终止当前的呼叫活动。看看下面的例子。

import android.app.Activity
import android.content.Intent

fun Activity.startActivity(
    cls: Class<*>,
    finishCallingActivity: Boolean = true,
    block: (Intent.() -> Unit)? = null
) {
    val intent = Intent(this, cls)
    block?.invoke(intent)
    startActivity(intent)
    if (finishCallingActivity) finish()
}

用法

startActivity(MainActivity::class.java) // Without Intent modification
startActivity(MainActivity::class.java) {
    // You can access the intent object in this block
    putExtra("key", "value")
}

Check Network

如今,根据我们的要求、特性和功能,我们所有的应用程序都具有互联网连接。因此,您可能需要检查互联网连接是否可用。
因此,此扩展功能对于检查活动和片段中的互联网连接很有用。它很容易在 if 语句和范围内的其他位置使用。

import android.content.Context
import android.net.ConnectivityManager
import android.net.NetworkCapabilities
import androidx.fragment.app.Fragment

fun Context.isNetworkAvailable(): Boolean {
    val manager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val capabilities = manager.getNetworkCapabilities(manager.activeNetwork)
    return if (capabilities != null) {
        capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)
                || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
                || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)
    } else false
}

fun Fragment.isNetworkAvailable() = requireContext().isNetworkAvailable()

用法

if (isNetworkAvailable()) {
    // Called when network is available
} else {
    // Called when network not available
}

Check Permission

为了完成我们的用例,您有时可能需要获得任何许可才能玩游戏。因此,我们可能必须验证是否为我们的应用程序授予了权限。因此,下面的扩展函数对于确定是否已授予权限很有用。

import android.content.Context
import android.content.pm.PackageManager
import androidx.core.content.ContextCompat

fun Context.isPermissionGranted(permission: String) = run {
    ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED
}

用法

if (isPermissionGranted(Manifest.permission.ACCESS_FINE_LOCATION)) {
    // Block runs if permission is granted
} else {
    // Ask for permission
}

用法

if (isPermissionGranted(Manifest.permission.ACCESS_FINE_LOCATION)) {
    // Block runs if permission is granted
} else {
    // Ask for permission
}

delete whitespaces

有时我们可能会从 Rest API 或其他一些数据源获得不切实际的文本数据。所以,如果你有多个空格并且你想删除它,那么我们可以使用removeDuplicateWhitespaces(),或者如果你想完全删除它,那么你可以使用removeAllWhitespaces()扩展函数。

fun String.removeAllWhitespaces(): String {
    return this.replace("\\s+".toRegex(), "")
}

fun String.removeDuplicateWhitespaces(): String {
    return this.replace("\\s+".toRegex(), " ")
}

用法

"Hello,     world!!!".removeAllWhitespaces() // Output: Hello,world!!!
"Hello,     world!!!".removeDuplicateWhitespaces() // Output: Hello, world!!!

toEditable()

可编辑是文本的界面,其内容和标记可以更改。如果你想将字符串转换为可编辑的,那么你必须处理一个可编辑的工厂实例。

现在,使用以下功能,您可以轻松删除样板代码。您可以在任何字符串函数中使用 toEditable()。并且,您可以使用它将文本分配给 EditText 字段。

import android.text.Editable

fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)

用法

etName.text = "First name".toEditable()

Screen Size

如果您正在处理基于某些状态或数据的动态视图布局,则可能需要使用设备屏幕尺寸。因此,将为此使用此扩展属性。它会给出设备的高度和宽度。您可以在活动范围内使用它或在其他地方使用上下文对象。

import android.content.Context
import android.graphics.Insets
import android.graphics.Rect
import android.os.Build
import android.util.DisplayMetrics
import android.util.Size
import android.view.WindowInsets
import android.view.WindowManager

val Context.screenSize: Size
    get() {
        val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager

        val size = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            val metrics = windowManager.currentWindowMetrics
            val windowInsets = metrics.windowInsets
            val insets: Insets = windowInsets.getInsetsIgnoringVisibility(
                WindowInsets.Type.navigationBars()
                        or WindowInsets.Type.displayCutout()
            )

            val insetsWidth: Int = insets.right + insets.left
            val insetsHeight: Int = insets.top + insets.bottom
            val bounds: Rect = metrics.bounds
            Size(
                bounds.width() - insetsWidth,
                bounds.height() - insetsHeight
            )
        } else {
            val displayMetrics = DisplayMetrics()
            windowManager.defaultDisplay?.getMetrics(displayMetrics)
            val height = displayMetrics.heightPixels
            val width = displayMetrics.widthPixels
            Size(width, height)
        }
        return size
    }

用法

val size = screenSize
val deviceHeight = size.height
val deviceWidth = size.width

System Service Managers

这些属性用于直接访问system manager而无需创建它的对象。您可以直接在活动中使用它,对于必须使用上下文的片段。请注意,下面列出的属性并非全部。但如果需要更多,您可以添加更多。

import android.app.DownloadManager
import android.app.NotificationManager
import android.content.Context
import android.net.ConnectivityManager
import android.view.WindowManager
import androidx.core.content.ContextCompat

val Context.windowManager
    get() = ContextCompat.getSystemService(this, WindowManager::class.java)

val Context.connectivityManager
    get() = ContextCompat.getSystemService(this, ConnectivityManager::class.java)

val Context.notificationManager
    get() = ContextCompat.getSystemService(this, NotificationManager::class.java)

val Context.downloadManager
    get() = ContextCompat.getSystemService(this, DownloadManager::class.java)

用法

val manager = downloadManager // In Activity
val manager = requireContext().downloadManager// In Fragment

Copy to clipboard

您可能偶尔需要将文本复制到剪贴板,以允许用户与其他应用共享文本。因此,您可以在字符串对象上使用下面列出的扩展属性,一切顺利。

import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import androidx.core.content.ContextCompat

fun String.copyToClipboard(context: Context) {
    val clipboardManager = ContextCompat.getSystemService(context, ClipboardManager::class.java)
    val clip = ClipData.newPlainText("clipboard", this)
    clipboardManager?.setPrimaryClip(clip)
}

用法

"This is clipboard".copyToClipboard(context)

Boolean Expressions

布尔值,是每个程序员的必备需求。在您的编程生活中,您每天都必须使用布尔值。在 kotlin 中,您可能必须同时处理可空性和布尔值,在这种情况下您可以利用这些扩展。在这里,我们也使用了合约的概念来实现智能铸造。

@file:OptIn(ExperimentalContracts::class)

import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.contract

fun Boolean?.isTrue(): Boolean {
    contract {
        returns(true) implies (this@isTrue != null)
    }
    return this == true
}

fun Boolean?.isFalse(): Boolean {
    contract {
        returns(true) implies (this@isFalse != null)
    }
    return this == false
}

val Boolean?.orTrue: Boolean
    get() = this ?: true

val Boolean?.orFalse: Boolean
    get() = this ?: false

用法

lateinit var any: Boolean? // Assume that, this property is already assigned
if (any.isTrue()) {
    // Run when any is true only
}
if (any.isFalse()) {
    // Run when any is false only
}
val any1: Boolean = any.orTrue // If any is null then any1 = true otherwise any1 = any
val any2: Boolean = any.orFalse // If any is null then any1 = false otherwise any1 = any

结论

在这篇博文中,我们探索了适用于 Android 开发人员的 Kotlin 扩展功能。这些扩展可以简化常见任务,例如处理字符串、处理日期和时间、管理网络等。它们可以节省时间和精力、减少错误并提高代码的整体质量。

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

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

相关文章

前端食堂技术周刊第 83 期:TS 5.1 RC、Nuxt 3.5、INP、Knip、管理 GitHub 通知、WebXR

By Midjournery 美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;杏花乌龙拿铁 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 本期摘要 TypeScript 5.1 RCNuxt 3.5INP 将成为新的 Core Web…

SSM 如何使用 Seata 框架实现分布式事务?

SSM 如何使用 Seata 框架实现分布式事务&#xff1f; 分布式事务是现代分布式系统中必不可少的一部分&#xff0c;而 Seata 框架是一种常用的分布式事务处理方式。在 SSM 框架中&#xff0c;我们可以使用 Seata 框架来管理分布式事务。本文将介绍如何在 SSM 框架中使用 Seata …

好用工具第2期:手机电脑传文件LocalSend

1. 概要 LocalSend 是一个跨平台的 AirDrop替工具软件。 适用于手机电脑之间的数据文件传输&#xff0c;不需要互联网连接或第三方服务器&#xff0c;是局域网本地通信的快速可靠解决方案。 LocalSend 是一个开源项目, 项目地址是: https://github.com/localsend/localsend …

webpack简单的搭建和使用

随便创建一个空的文件夹&#xff0c;例如说&#xff1a;explore 然后我们测试一下我们的node是否存在 可以正确打印出版本 我们再次输入&#xff1a;npm init -y 创建一个package.json文件 出现这样的情况就成功了 然后我们要安装webpack在终端上输入命令&#xff1a; npm i …

辅助生成: 低延迟文本生成的新方向

大型语言模型如今风靡一时&#xff0c;许多公司投入大量资源来扩展它们规模并解锁新功能。然而&#xff0c;作为注意力持续时间不断缩短的人类&#xff0c;我们并不喜欢大模型缓慢的响应时间。由于延迟对于良好的用户体验至关重要&#xff0c;人们通常使用较小的模型来完成任务…

Kotlin SOLID 原则

Kotlin SOLID 原则 许多 Kotlin 开发者并不完全了解 SOLID 原理&#xff0c;即使他们知道&#xff0c;他们也不知道为什么要使用它。您准备好了解所有细节了吗&#xff1f; 介绍 亲爱的 Kotlin 爱好者&#xff0c;您好&#xff01;欢迎来到我的新文章。今天我要讲的是 Kotli…

Qt编程基础 | 第六章-窗体 | 6.2、VS导入资源文件

一、VS导入资源文件 1.1、导入资源文件 步骤一&#xff1a; 将所有图片放到各自文件夹下&#xff0c;并将文件夹拷贝到资源文件&#xff08;.qrc文件&#xff09;的同级目录下&#xff0c;如下&#xff1a; 步骤二&#xff1a; 新建VS项目的时候&#xff0c;系统会自动建好一…

如何在华为OD机试中获得满分?Java实现【最差产品奖】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

NetApp AFF C 系列——可持续、可扩展且安全可靠的全闪存解决方案

NetApp AFF C 系列 采用全新的闪存技术&#xff0c;同时辅以智能科技加持&#xff0c;将为您带来一个更为经济实惠的全闪存解决方案&#xff0c;它重新定义了安全性、可扩展性和可持续性。 为什么选择 AFF C 系列的新一代全闪存解决方案&#xff1f; 实现现代化&#xff0c;打…

chatgpt+mj+did生成会说话的头像

chatgptmjdid生成会说话的头像 当我们有了 ChatGPT 生成的内容&#xff0c;有了 stable-diffusion、midjourney 或者 dalle2 生成的人像&#xff0c;如果还能让人像动起来&#xff0c;替我们朗诵或者播报一下 ChatGPT 的内容&#xff0c;不就是一个数字人了么&#xff1f; D-…

2023年 微信生态催生就业收入机会超5000万个

文章目录 微信生态催生就业收入机会超5000万个原因相关情况总结 结语 微信生态催生就业收入机会超5000万个 ​ 近年来&#xff0c;随着移动互联网的普及和发展&#xff0c;微信作为国内最大的社交平台之一&#xff0c;已经成为人们日常生活中必不可少的工具。同时&#xff0c;…

嘉立创EDA专业版网络规则设置

在“设计规则”中的“规则管理”界面将PCB的各个设计规则如线宽规则、差分规则、过孔规则等设置完成之后&#xff0c;就需要将PCB中每个网络所对应的规则进行驱动&#xff0c;那么就可以设置“网络规则”。在“网络规则”中可以对当前PCB内的所有网络进行规则分配&#xff0c;继…

数字图像处理 基于傅里叶变换的图像拼接

一、简述 这里讨论的算法主要是指应用于基于相机拍摄的显微镜的2D图像的拼接。基于2D显微图像的拼接通常只考虑x、y方向的位移。 图像拼接在图像处理中应用广泛。特别是对高分辨率标本成像的需求日益增加。通常,这些标本不适合显微镜的视野。为了克服这一缺点,使用移动样品的…

泡泡玛特发布首支生态公益微纪录片 潮玩IP助力生物多样性保护

5月22日国际生物多样性日&#xff0c;泡泡玛特联合中国环境发布了首支生态公益微纪录片&#xff0c;通过潮玩艺术家AYAN和野生动物保护者初雯雯两个年轻人的故事&#xff0c;用一种全新的方式&#xff0c;唤起年轻人对动物保护和环境保护的关注。 AYAN的DIMOO与蒙新河狸 对于潮…

m1下git的客户端工具及idea配置

背景&#xff1a;换了m2以后&#xff0c;好多软件都不兼容&#xff0c;然后同步代码的事情就一直搁置了&#xff0c;今天记录一下如何用客户端工具同步代码和idea中配置远程仓库 第一步&#xff1a;下载github desktop&#xff0c;有针对m1芯片的&#xff0c;填写上你github的…

Java并发体系-锁与同步-[2]

可见性设计的硬件 从硬件的级别来考虑一下可见性的问题 **1、第一个可见性的场景&#xff1a;**每个处理器都有自己的寄存器&#xff08;register&#xff09;&#xff0c;所以多个处理器各自运行一个线程的时候&#xff0c;可能导致某个变量给放到寄存器里去&#xff0c;接着…

【Java多线程案例】使用阻塞队列实现生产者消费者模型

前言 本篇文章讲解多线程案例之阻塞队列。主要讲解阻塞队列的特性、实际开发中常用的到的生产者消费者模型&#xff0c;以及生产者消费者模型解耦合、削峰填谷的好处。并且使用 Java 多线程模拟实现一个生产者消费者模型、阻塞队列版的生产者消费者模型。 文章从什么是阻塞队列…

12道c语言的课后习题!

1、计算n的阶乘&#xff08;1*2*3*4*5 n是个数&#xff0c;比如说乘到100&#xff1f;&#xff09; // 计算n的阶乘#include"stdio.h"int main() {int n 0;scanf("%d", &n);int i 0;int ret 1;for (i 1; i < n; i) {ret * i;}printf("…

技术分享| 融合会议协议大解密

anyRTC的融合会议解决方案中&#xff0c;支持H.323协议、SIP协议、GB28181国标协议、私有协议等等&#xff0c;实际在跟客户沟通时&#xff0c;我们常会被问到到底是SIP还是H.323好&#xff1f;客户前期已经建设了视频会议系统&#xff0c;有H.323的、有腾讯会议/Zoom这种互联网…

ESLint驼峰命名法规则校验关闭

目录 1、简单介绍ESLint1.1 ESLint是什么1.2 ESLint的好处1.3 ESLint的规范 2、 驼峰校验提示3、解决方案 1、简单介绍ESLint 1.1 ESLint是什么 ESLint 是一个代码检查工具&#xff0c;用来检查你的代码是否符合指定的规范 例如: 的前后必须有一个空格例如: 函数名后面必须…