Android KTX   Android Jetpack の一部。

Android KTX は、Android Jetpack およびその他の Android ライブラリに含まれる Kotlin 拡張機能セットです。KTX の拡張機能によって、Jetpack、Android プラットフォーム、その他の API で、Kotlin が簡潔になってわかりやすくなります。その目的のため、これらの拡張機能では、次のようないくつかの Kotlin 言語機能が活用されています。

  • 拡張関数
  • 拡張プロパティ
  • ラムダ
  • 名前付きパラメータ
  • パラメータのデフォルト値
  • コルーチン

たとえば、SharedPreferences を扱う場合、優先設定データを変更するにはエディタを作成する必要があります。また、次の例のように、編集が完了したら変更を適用または commit する必要があります。

sharedPreferences
            .edit()  // create an Editor
            .putBoolean("key", value)
            .apply() // write to disk asynchronously
    

Kotlin lambda は、このユースケースに最適です。エディタ作成後に実行するコードのブロックを渡してコードを実行させ、SharedPreferences API に変更をアトミックに適用させることで、より簡潔なアプローチが可能になります。

Android KTX Core 関数 SharedPreferences.edit の一例を次に示します。これにより、編集関数が SharedPreferences に追加されます。この関数は、変更の commit あるいは適用を指示する最初の引数として、オプションの boolean フラグを取ります。また、SharedPreferences エディタで実行するアクションを、ラムダの形式で受け取ります。

// SharedPreferences.edit extension function signature from Android KTX - Core
    // inline fun SharedPreferences.edit(
    //         commit: Boolean = false,
    //         action: SharedPreferences.Editor.() -> Unit)

    // Commit a new value asynchronously
    sharedPreferences.edit { putBoolean("key", value) }

    // Commit a new value synchronously
    sharedPreferences.edit(commit = true) { putBoolean("key", value) }
    

呼び出し元は、変更を commit するか適用するかを選択できます。action ラムダはそれ自体が SharedPreferences.Editor 上の匿名拡張関数であり、署名で示されているとおりに Unit を返します。この理由により、ブロック内部において SharedPreferences.Editor 上で作業を直接実行することが可能になっています。

最後に、SharedPreferences.edit() 署名には inline キーワードが含まれます。 このキーワードによって、関数が使用されるたびにその関数のコンパイル済みバイトコードをコピー&ペースト(あるいはインライン)すべきか、Kotlin コンパイラに指示されます。 これにより、この関数が呼び出されるたびにすべての action に新しいクラスをインスタンス化する手間がなくなります。

ラムダを使用してコードを渡し、オーバーライド可能な合理的デフォルトを適用し、inline 拡張関数を使用してこれらの動作を既存の API に追加するこのパターンは、Android KTX ライブラリで提供される拡張機能の典型です。

プロジェクトで Android KTX を使用する

Android KTX の使用を開始するには、プロジェクトの build.gradle ファイルに次の依存関係を追加します。

repositories {
        google()
    }
    

Android KTX は複数のモジュールに整理されており、各モジュールに 1 つ以上のパッケージが含まれます。

各モジュール アーティファクトの依存関係をアプリの build.gradle ファイルに含める必要があります。アーティファクトには必ずバージョン番号を追加してください。たとえば、core-ktx モジュールを使用する場合、完全形式の依存関係は次のようになります。

dependencies {
        implementation 'androidx.core:core-ktx:1.0.1'
    }
    

モジュール

Android KTX には、共通フレームワーク API 用 Kotlin 拡張機能と複数のドメイン固有の拡張機能を提供する 1 つのコアモジュールが含まれています。

コアモジュールを除くすべての KTX モジュール アーティファクトによって、build.gradle ファイル内で基盤となる Java 依存関係を置き換えることができます。たとえば、androidx.fragment:fragment の依存関係を androidx.fragment:fragment-ktx に置き換えることができます。この構文はバージョニング管理の改善に役立ちます。依存関係宣言の要件が追加されることはありません。

Core KTX

Core KTX モジュールによって、Android フレームワークの一部である共通ライブラリに拡張機能が提供されます。これらのライブラリには、build.gradle への追加が必要な Java ベースの依存関係はありません。

Core KTX モジュールに含まれるパッケージのリストを次に示します。

Fragment KTX

依存関係: androidx.fragment:fragment-ktx:$version。必ず、$version を定義するか、リテラル値に置き換えてください。

Fragment KTX モジュールには、フラグメント API を簡略化するための拡張機能が数多く用意されています。たとえば、ラムダでフラグメント トランザクションを簡略化できます。

fragmentManager().commit {
       addToBackStack("...")
       setCustomAnimations(
               R.anim.enter_anim,
               R.anim.exit_anim)
       add(fragment, "...")
    }
    

また、viewModels および activityViewModels のプロパティ委任を使用して ViewModel を 1 行にバインディングすることもできます。

// Get a reference to the ViewModel scoped to this Fragment
    val viewModel by viewModels<MyViewModel>()

    // Get a reference to the ViewModel scoped to its Activity
    val viewModel by activityViewModels<MyViewModel>()
    

Palette KTX

依存関係: androidx.palette:palette-ktx:$version。必ず、$version を定義するか、リテラル値に置き換えてください。

Palette KTX モジュールは、カラーパレット作業時に Kotlin を使いやすくするためのサポートを提供します。

たとえば、Palette インスタンスを扱う場合、get 演算子([ ])を使用して、指定された target 向けに selected 色見本を取得できます。

val palette = Palette.from(bitmap).generate()
    val swatch = palette[target]
    

SQLite KTX

依存関係: androidx.sqlite:sqlite-ktx:$version。必ず、$version を定義するか、リテラル値に置き換えてください。

SQLite 拡張機能で SQL 関連のコードをトランザクション内にラップすると、次の例に示すように、多くのボイラープレート コードを省けます。

db.transaction {
        // insert data
    }
    

Collection KTX

依存関係: androidx.collection:collection-ktx:$version。必ず、$version を定義するか、リテラル値に置き換えてください。

Collection 拡張機能には、ArrayMapLongParseArrayLruCache など、メモリ効率の良い Android のコレクション ライブラリを扱うためのユーティリティ関数が含まれています。

Collection 拡張機能では、次の例のように、Kotlin の演算子オーバーロードを活用することで、コレクション連結などの動作が簡略化されます。

// Combine 2 ArraySets into 1.
    val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)

    // Combine with numbers to create a new sets.
    val newArraySet = combinedArraySet + 7 + 8
    

ViewModel KTX

依存関係: androidx.lifecycle:lifecycle-viewmodel-ktx:$version。最新のモジュール バージョンを反映して $version を定義または置換します。

ViewModel KTX ライブラリでは、ViewModel からコルーチンを起動しやすくする viewModelScope() 関数が提供されています。CoroutineScopeDispatchers.Main にバインドされ、ViewModel が消去されると自動的にキャンセルされます。各 ViewModel に新しいスコープを作成するのではなく viewModelScope() を使用することができます。

たとえば、次の viewModelScope() 関数では、バックグラウンド スレッドでネットワーク要求を行うコルーチンが起動します。ライブラリは、すべての設定および対応するスコープ消去を処理します。

class MainViewModel : ViewModel() {
        // Make a network request without blocking the UI thread
        private fun makeNetworkRequest() {
            // launch a coroutine in viewModelScope
            viewModelScope.launch  {
                remoteApi.slowFetch()
                ...
            }
        }

        // No need to override onCleared()
    }
    

Reactive Streams KTX

依存関係: androidx.lifecycle:lifecycle-reactivestreams-ktx:$version。 必ず $version を定義するか、リテラル値に置き換えてください。

Collection KTX モジュールでは、監視可能な LiveData ストリームを ReactiveStreams パブリッシャーから作成できます。

たとえば、ユーザー数が少ないデータベースがあるとします。アプリでは、データベースをメモリに読み込んでから UI にユーザーデータが表示されます。これを行うためには RxJava などが使用されます。 Room Jetpack コンポーネントでは、ユーザーリストを Flowable として取得できます。このシナリオでは、フラグメントあるいはアクティビティの全期間にわたって Rx パブリッシャーのサブスクリプションを管理する必要もあります。

しかし、LiveDataReactiveStreams では、LiveData を簡略化しながらも RxJava とその充実した演算子および作業スケジューリング機能のセットを活用することができます。たとえば、次のスニペットでは、監視可能なストリームが RxJava Flowable パブリッシャーから作成されます。

val fun getUsersLiveData() : LiveData<List<User>> {
        val users: Flowable<List<User>> = dao.findUsers()
        return LiveDataReactiveStreams.fromPublisher(users)
    }
    

依存関係:

  • androidx.navigation:navigation-runtime-ktx:$version
  • androidx.navigation:navigation-fragment-ktx:$version
  • androidx.navigation:navigation-ui-ktx:$version

必ず $version を定義するか、リテラル値に置き換えてください。

Navigation ライブラリの各コンポーネントには、API をより簡潔にして Kotlin で使いやすく適応させる独自の KTX バージョンがあります。

次の例に示すように、拡張関数とプロパティ委任を使用して宛先引数にアクセスし、宛先に移動します。

class MyDestination : Fragment() {

        // Type-safe arguments are accessed from the bundle.
        val args by navArgs<MyDestinationArgs>()

        ...
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            view.findViewById<Button>(R.id.next)
                .setOnClickListener {
                    // Fragment extension added to retrieve a NavController from
                    // any destination.
                    findNavController().navigate(R.id.action_to_next_destination)
                }
         }
         ...

    }
    

WorkManager KTX

依存関係: androidx.work:work-runtime-ktx:$version。必ず、$version を定義するか、リテラル値に置き換えてください。

次の例に示すように、WorkManager KTX では、Operations および ListenableFutures に拡張関数を追加することで Kotlin コルーチンのサポートが追加され、現在のコルーチンは停止しています。

// Inside of a coroutine...

    // Run async operation and suspend until completed.
    WorkManager.getInstance()
            .beginWith(longWorkRequest)
            .enqueue().await()

    // Resume after work completes...
    

Play Core KTX

依存関係: com.google.android.play:core-ktx:$version。必ず、$version を定義するか、リテラル値に置き換えてください。

Play Core KTX では、Play Core ライブラリの SplitInstallManager および AppUpdateManager に拡張関数を追加することで、ワンショット リクエスト用 Kotlin コルーチンおよびステータス アップデート モニタリング用フローのサポートが追加されています。

// Inside of a coroutine...

    // Request in-app update status updates.
    manager.requestUpdateFlow().collect { updateResult ->
        when (updateResult) {
            is AppUpdateResult.Available -> { TODO() }
            is AppUpdateResult.InProgress -> { TODO() }
            is AppUpdateResult.Downloaded -> { TODO() }
            AppUpdateResult.NotAvailable -> { TODO() }
        }
    }
    

参照情報

Android KTX の詳細については、DevBytes の動画をご覧ください。

問題を報告または機能を提案するには、Android KTX の Issue Tracker をご使用ください。