Android 開発者向けの 10 の便利な Kotlin 拡張機能 #2
優れた Kotlin 拡張機能で生産性を向上
テキストの編集
EditText の「text」プロパティを使用すると、EditText 内のテキストをすばやく取得できます。ただし、このテキストは「編集可能」であるため、EditText の正確な値を取得するには毎回文字列に変換する必要があります。ただし、良いニュースは、以下にリストされている拡張プロパティを使用して、EditText の値を簡単に取得できることです。
import android.widget.EditText
val EditText.value
get() = text?.toString() ?: ""
使用法
val name = etName.value
開始アクティビティ
アクティビティの開始は、別のアクティビティに移行する一般的な方法です。まず、ターゲット アクティビティの意図を解決する必要があります。しかし、この拡張機能を利用することで、インテント作成部分を省略することができます。
データやその他のものを渡すようにインテントをカスタマイズすることもできます。必要に応じて、現在の通話アクティビティを終了することもできます。以下の例を見てください。
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")
}
ネットワークをチェックする
現在、当社のすべてのアプリケーションは、当社の要件、機能、および機能に従ってインターネット接続を備えています。したがって、インターネット接続が利用可能かどうかを確認する必要がある場合があります。
したがって、この拡張機能はアクティビティやフラグメントでのインターネット接続を確認するのに役立ちます。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
}
権限の確認
私たちのユースケースを達成するために、ゲームをプレイするための許可を取得する必要がある場合があります。したがって、アプリケーションに対して権限が付与されていることを確認する必要がある場合があります。そこで、許可の有無を判定するには、以下の拡張関数が便利です。
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
}
空白を削除する
場合によっては、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()
Editable は、コンテンツとマークアップを変更できるテキストへのインターフェイスです。文字列を編集可能に変換したい場合は、編集可能なファクトリ インスタンスを処理する必要があります。
次の関数を使用すると、定型コードを簡単に削除できます。toEditable() は任意の文字列関数とともに使用できます。また、これを使用して、EditText フィールドにテキストを割り当てることができます。
import android.text.Editable
fun String.toEditable(): Editable = Editable.Factory.getInstance().newEditable(this)
使用法
etName.text = "First name".toEditable()
画面サイズ
何らかの状態またはデータに基づいて動的なビュー レイアウトを扱っている場合は、デバイスの画面サイズを使用することをお勧めします。したがって、この拡張属性はこれに使用されます。デバイスの高さと幅が表示されます。アクティビティ スコープで使用することも、他の場所でコンテキスト オブジェクトを使用することもできます。
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
システムサービスマネージャー
これらのプロパティは、オブジェクトを作成せずにシステム マネージャーに直接アクセスするために使用されます。アクティビティ内で直接使用できますが、フラグメントの場合はコンテキストを使用する必要があります。以下にリストされているプロパティはすべてを網羅しているわけではないことに注意してください。ただし、さらに必要な場合はさらに追加できます。
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
クリップボードにコピー
ユーザーが他のアプリケーションとテキストを共有できるようにするために、テキストをクリップボードにコピーすることが必要になる場合があります。したがって、以下にリストされている拡張プロパティを文字列オブジェクトで使用すれば、準備は完了です。
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)
ブール式
ブール値はすべてのプログラマーにとって必須の要件です。プログラミング生活では毎日ブール値を使用する必要があります。kotlin では、null 可能性とブール値の両方を処理する必要がある場合がありますが、その場合はこれらの拡張機能を利用できます。ここでもコントラクトの概念を利用してスマートキャストを実現しています。
@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 拡張機能について説明します。これらの拡張機能により、文字列の操作、日付と時刻の操作、ネットワークの管理などの一般的なタスクが簡素化されます。時間と労力を節約し、エラーを減らし、コードの全体的な品質を向上させます。