0Pricing
Kotlin Academy · レッスン

実践的な拡張:Context、View、Stringヘルパー

一般的なパターンに対応する、実用的なAndroidスタイルのユーティリティ拡張を構築します。

「実践的な拡張:Context、View、Stringヘルパー」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。

実践的な拡張

変更できないフレームワーク型に対して、拡張は特に威力を発揮します。対象は Context、View、String、コレクションなどです。以下では、実際の Android コードベースで使われている実践的なパターンを紹介します。

Context.toast ヘルパー

冗長な Toast.makeText(...).show() を、1 行の拡張でラップします。

import android.content.Context
import android.widget.Toast
fun Context.toast(message: String, long: Boolean = false) {
    val duration = if (long) Toast.LENGTH_LONG else Toast.LENGTH_SHORT
    Toast.makeText(this, message, duration).show()
}
// Usage: context.toast("Saved!")

Context のリソースヘルパー

リソース検索でのキャストを避けられます。拡張によって、可読性と型安全性が向上します。

import android.content.Context
import androidx.core.content.ContextCompat
fun Context.color(res: Int) = ContextCompat.getColor(this, res)
fun Context.string(res: Int) = getString(res)
fun Context.dp(value: Int) = (value * resources.displayMetrics.density).toInt()
// Usage: val red = context.color(R.color.error)

View.show / View.hide

特別な記述をせずに View.VISIBLE / View.GONE を切り替えます。

import android.view.View
fun View.show() { visibility = View.VISIBLE }
fun View.hide() { visibility = View.GONE }
fun View.invisible() { visibility = View.INVISIBLE }
// Usage: progressBar.show(); button.hide()

View.setVisible(boolean)

条件に応じて切り替える 1 行の処理です。if-else による表示状態のコードを置き換えられます。

import android.view.View
fun View.setVisible(visible: Boolean) {
    visibility = if (visible) View.VISIBLE else View.GONE
}
// Usage: errorLabel.setVisible(state.hasError)

View.onClick ラムダ

匿名の OnClickListener ではなくラムダを渡すことで、クリックリスナーをより簡潔に記述できます。

import android.view.View
fun View.onClick(action: (View) -> Unit) {
    setOnClickListener(action)
}
// Usage:
// button.onClick { view -> println("clicked") }

String.isValidEmail

String にドメイン固有の検証用拡張を追加すると、ビジネスロジックが読みやすくなります。

fun String.isValidEmail(): Boolean {
    val regex = Regex("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$")
    return regex.matches(this)
}
fun main() {
    println("ada@example.com".isValidEmail()) // true
    println("nope".isValidEmail())             // false
}

String.truncate

長い文字列を省略記号付きで切り詰めます。UI でよく使うヘルパーです。

fun String.truncate(max: Int, ellipsis: String = "..."): String =
    if (length <= max) this else substring(0, max - ellipsis.length) + ellipsis
fun main() {
    println("The quick brown fox".truncate(10)) // The qui...
    println("short".truncate(10))                // short
}

String.toTitleCase

各単語の先頭を大文字にします。よく使われる書式設定用ヘルパーです。

fun String.toTitleCase(): String = split(" ").joinToString(" ") {
    if (it.isEmpty()) it
    else it[0].uppercaseChar() + it.substring(1).lowercase()
}
fun main() {
    println("hello WORLD from kotlin".toTitleCase())
}

List の拡張: chunkedBy

連続する要素をキーごとにグループ化します。UI のセクション分けに便利です。

fun <T, K> List<T>.chunkedBy(keySelector: (T) -> K): List<List<T>> {
    val result = mutableListOf<MutableList<T>>()
    var lastKey: K? = null
    for (item in this) {
        val key = keySelector(item)
        if (key == lastKey) result.last().add(item)
        else { result.add(mutableListOf(item)); lastKey = key }
    }
    return result
}
fun main() {
    val data = listOf(1, 1, 2, 2, 2, 3, 1)
    println(data.chunkedBy { it }) // [[1, 1], [2, 2, 2], [3], [1]]
}

Activity ヘルパー

reified ジェネリクスを使用して、ナビゲーションを型安全かつ簡潔にします。

import android.content.Context
import android.content.Intent
inline fun <reified T> Context.startActivity() {
    startActivity(Intent(this, T::class.java))
}
// Usage: context.startActivity<MainActivity>()

使いすぎに注意

拡張はグローバル名前空間に追加されます。目的を絞り、スコープ(private/internal)を限定し、ドメインごとにまとめてください(レシーバー型ごとに 1 ファイルにすると扱いやすくなります)。

fun String.shout() = uppercase() + "!"
fun String.whisper() = lowercase() + "..."
fun main() {
    println("hello".shout())
    println("HELLO".whisper())
}

クイックチェック

Context や View のような Android フレームワーク型に、拡張が適しているのはなぜですか?

まとめ

拡張は、フレームワーク型(Context、View、String、List)に使いやすいヘルパーを追加するのに最適です。よくあるパターンには、表示状態の切り替え、クリックリスナー、リソース検索、検証、書式設定があります。拡張の目的を絞り、スコープを限定し、レシーバー型ごとにまとめてください。

よくある質問

「実践的な拡張:Context、View、Stringヘルパー」レッスンは無料ですか?

はい。「実践的な拡張:Context、View、Stringヘルパー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。

「実践的な拡張:Context、View、Stringヘルパー」で何を学びますか?

一般的なパターンに対応する、実用的なAndroidスタイルのユーティリティ拡張を構築します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Kotlin Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「実践的な拡張:Context、View、Stringヘルパー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このKotlin Academyレッスンでコードを書いて実行できますか?

はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 拡張関数:構文とディスパッチ規則
  2. 拡張プロパティと計算拡張
  3. スコープ付き拡張とcompanion拡張
  4. 実践的な拡張:Context、View、Stringヘルパー
← Kotlin Academyに戻る