Android KTX Android Jetpack'in bir parçasıdır.

Android KTX, Android Jetpack ve diğer Android kitaplıklarına dahil olan bir Kotlin uzantıları grubudur. KTX uzantıları Jetpack, Android platformu ve diğer API'lere kısa ve özlü, eş anlamlı bir Kotlin deneyimi sunar. Bunu yapmak için bu uzantılar, aşağıdakiler dahil olmak üzere çeşitli Kotlin dili özelliklerinden yararlanır:

  • Uzantı işlevleri
  • Uzantı özellikleri
  • Lambdalar
  • Adlandırılmış parametreler
  • Parametre varsayılan değerleri
  • Eş yordamlar

Örneğin, SharedPreferences ile çalışırken tercih verilerinde değişiklik yapabilmek için bir düzenleyici oluşturmanız gerekir. Bu değişiklikleri, aşağıdaki örnekte gösterildiği gibi düzenlemeyi bitirdiğinizde de uygulamanız veya uygulamanız gerekir:

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

Kotlin lambda'ları bu kullanım alanı için mükemmel bir seçenektir. Bu şablonlar, düzenleyici oluşturulduktan sonra yürütülecek bir kod bloğunu ileterek, kodun yürütülmesine ve ardından SharedPreferences API'nin değişiklikleri atomik olarak uygulamasına izin vererek daha kısa bir yaklaşım izlemenizi sağlar.

Aşağıda, SharedPreferences öğesine düzenleme işlevi ekleyen Android KTX Core işlevlerinden biri (SharedPreferences.edit) verilmiştir. Bu işlev, değişikliklerin uygulanacağını veya uygulanacağını belirten ilk bağımsız değişken olarak isteğe bağlı bir boolean işaretini alır. Ayrıca SharedPreferences düzenleyicide lambda biçiminde gerçekleştirilecek bir işlem de alır.

// 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) }

Arayan, değişiklikleri kaydetmeyi veya uygulamayı tercih edebilir. action lambda'nın kendisi, imzasından anlaşıldığı üzere Unit değerini döndüren SharedPreferences.Editor üzerinde bir anonim uzantı işlevidir. Bu nedenle, bloğun içinde işi doğrudan SharedPreferences.Editor üzerinde gerçekleştirebilirsiniz.

Son olarak, SharedPreferences.edit() imzası inline anahtar kelimesini içerir. Bu anahtar kelime, Kotlin derleyicisine işlev her kullanıldığında işlev için derlenen bayt kodunu kopyalayıp yapıştırması (veya satır içi olması) gerektiğini bildirir. Bu sayede, bu işlevin her çağrılışında her action için yeni bir sınıf somutlaştırma ek yükü önlenir.

Lambda'lar kullanarak kod geçirme, geçersiz kılınabilecek makul varsayılanlar uygulama ve inline uzantı işlevlerini kullanarak bu davranışları mevcut API'lere ekleme kalıbı, Android KTX kitaplığı tarafından sağlanan geliştirmelerin tipik bir örneğidir.

Projenizde Android KTX'i kullanma

Android KTX'i kullanmaya başlamak için projenizin build.gradle dosyasına aşağıdaki bağımlılığı ekleyin:

Modern

repositories {
    google()
}

Kotlin

repositories {
    google()
}

AndroidX Modülleri

Android KTX, her modülün bir veya daha fazla paket içerdiği modüller halinde düzenlenmiştir.

Uygulamanızın build.gradle dosyasına her modül yapısı için bir bağımlılık eklemeniz gerekir. Yapıya sürüm numarasını eklemeyi unutmayın. En son sürüm numaralarını bu konudaki her yapının ilgili bölümünde bulabilirsiniz.

Android KTX, ortak çerçeve API'leri ve alana özgü çeşitli uzantılar için Kotlin uzantıları sunan tek çekirdekli bir modül içerir.

Temel modül haricinde tüm KTX modülü yapıları, build.gradle dosyanızdaki temel Java bağımlılığının yerini alır. Örneğin, bir androidx.fragment:fragment bağımlılığını androidx.fragment:fragment-ktx ile değiştirebilirsiniz. Bu söz dizimi, sürüm oluşturmayı daha iyi yönetmeye yardımcı olur ve başka bağımlılık bildirimi gereksinimleri eklemez.

Çekirdek KTX

Core KTX modülü, Android çerçevesinin parçası olan ortak kitaplıklar için uzantılar sağlar. Bu kitaplıklar, build.gradle öğesine eklemeniz gereken Java tabanlı bağımlılıklara sahip değildir.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakini ekleyin:

Modern

dependencies {
    implementation "androidx.core:core-ktx:1.12.0"
}

Kotlin

dependencies {
    implementation("androidx.core:core-ktx:1.12.0")
}

Çekirdek KTX modülünde yer alan paketlerin listesi aşağıda verilmiştir:

Koleksiyon KTX'i

Koleksiyon uzantıları, Android'in ArrayMap, LongSparseArray ve LruCache gibi belleği verimli kullanan koleksiyon kitaplıklarıyla çalışmaya yönelik yardımcı program işlevleri içerir.

Bu modülü kullanmak için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Eğlenceli

dependencies {
    implementation "androidx.collection:collection-ktx:1.2.0"
}

Kotlin

dependencies {
    implementation("androidx.collection:collection-ktx:1.2.0")
}

Koleksiyon uzantıları, aşağıdaki örnekte gösterildiği gibi, koleksiyonları birleştirme gibi işlemleri basitleştirmek için Kotlin operatörünün aşırı yüklemesinden yararlanır:

// 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

Parça KTX

Fragment KTX modülü, fragman API'sini basitleştiren çeşitli uzantılar sunar.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakini ekleyin:

Eğlenceli

dependencies {
    implementation "androidx.fragment:fragment-ktx:1.6.1"
}

Kotlin

dependencies {
    implementation("androidx.fragment:fragment-ktx:1.6.1")
}

Fragment KTX modülü sayesinde, lambda'larla parça işlemlerini basitleştirebilirsiniz. Örneğin:

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

Ayrıca viewModels ve activityViewModels mülk yetkilerini kullanarak bir ViewModel öğesini tek satırda bağlayabilirsiniz:

// 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>()

Yaşam döngüsü KTX

Yaşam döngüsü KTX'i, her Lifecycle nesnesi için bir LifecycleScope tanımlar. Bu kapsamda başlatılan tüm programlar, Lifecycle kaldırıldığında iptal edilir. lifecycle.coroutineScope veya lifecycleOwner.lifecycleScope özelliklerini kullanarak Lifecycle öğesinin CoroutineScope öğesine erişebilirsiniz.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakini ekleyin:

Eğlenceli

dependencies {
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.2"
}

Kotlin

dependencies {
    implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
}

Aşağıdaki örnek, önceden hesaplanmış metni eşzamansız olarak oluşturmak için lifecycleOwner.lifecycleScope özelliğinin nasıl kullanılacağını gösterir:

class MyFragment: Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewLifecycleOwner.lifecycleScope.launch {
            val params = TextViewCompat.getTextMetricsParams(textView)
            val precomputedText = withContext(Dispatchers.Default) {
                PrecomputedTextCompat.create(longTextContent, params)
            }
            TextViewCompat.setPrecomputedText(textView, precomputedText)
        }
    }
}

LiveData KTX

LiveData kullanırken değerleri eşzamansız olarak hesaplamanız gerekebilir. Örneğin, bir kullanıcının tercihlerini almak ve bunları kullanıcı arayüzünüze sunmak isteyebilirsiniz. Bu durumlarda LiveData KTX, suspend işlevi çağıran ve sonucu LiveData nesnesi olarak sunan bir liveData oluşturucu işlevi sağlar.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakini ekleyin:

Eğlenceli

dependencies {
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.6.2"
}

Kotlin

dependencies {
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2")
}

Aşağıdaki örnekte loadUser(), başka bir yerde tanımlanan bir askıya alma işlevidir. loadUser() öğesini eşzamansız olarak çağırmak için liveData oluşturucu işlevini kullanabilir ve ardından, sonucu yaymak için emit() kullanabilirsiniz:

val user: LiveData<User> = liveData {
    val data = database.loadUser() // loadUser is a suspend function.
    emit(data)
}

LiveData ile eş yordamlar kullanma hakkında daha fazla bilgi için Kotlin eş yordamlarını Mimari bileşenleriyle kullanma bölümüne bakın.

Gezinme kitaplığının her bileşeninin, API'yi daha kısa ve öz olacak şekilde uyarlayan kendi KTX sürümü vardır.

Bu modülleri dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Eğlenceli

dependencies {
    implementation "androidx.navigation:navigation-runtime-ktx:2.7.2"
    implementation "androidx.navigation:navigation-fragment-ktx:2.7.2"
    implementation "androidx.navigation:navigation-ui-ktx:2.7.2"
}

Kotlin

dependencies {
    implementation("androidx.navigation:navigation-runtime-ktx:2.7.2")
    implementation("androidx.navigation:navigation-fragment-ktx:2.7.2")
    implementation("androidx.navigation:navigation-ui-ktx:2.7.2")
}

Aşağıdaki örnekte gösterildiği gibi, hedef bağımsız değişkenlere erişmek ve hedeflere gitmek için uzantı işlevlerini ve özellik yetkilendirmesini kullanın:

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)
            }
     }
     ...

}

Palet KTX

Palet KTX modülü, renk paletleriyle çalışmak için deyimsel Kotlin desteği sunar.

Bu modülü kullanmak için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Eğlenceli

dependencies {
    implementation "androidx.palette:palette-ktx:1.0.0"
}

Kotlin

dependencies {
    implementation("androidx.palette:palette-ktx:1.0.0")
}

Örneğin, bir Palette örneğiyle çalışırken get operatörünü ([ ]) kullanarak belirli bir target için selected kartelasını alabilirsiniz:

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

Reaktif Akışlar KTX

Reaktif Akışlar KTX modülü, bir ReactiveStreams yayıncısından gözlemlenebilir bir LiveData akışı oluşturmanızı sağlar.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakini ekleyin:

Eğlenceli

dependencies {
    implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.6.2"
}

Kotlin

dependencies {
    implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.6.2")
}

Örneğin, kullanıcı sayısı az olan bir veritabanı olduğunu varsayalım. Uygulamanızda veritabanını belleğe yükler ve ardından kullanıcı verilerini kullanıcı arayüzünde gösterirsiniz. Bunu sağlamak için RxJava'yı kullanabilirsiniz. Room Jetpack bileşeni, kullanıcı listesini Flowable olarak alabilir. Bu senaryoda, parçanızın veya etkinliğinizin ömrü boyunca Rx yayıncı aboneliğini de yönetmeniz gerekir.

Ancak LiveDataReactiveStreams ile RxJava, zengin operatör kümesinden ve iş planlama özelliklerinden yararlanabilir ve aşağıdaki örnekte gösterildiği gibi LiveData basitliğinden yararlanabilirsiniz:

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

Oda KTX'i

Oda uzantıları, veritabanı işlemleri için eş yordam desteği ekler.

Bu modülü kullanmak için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Modern

dependencies {
    implementation "androidx.room:room-ktx:2.5.2"
}

Kotlin

dependencies {
    implementation("androidx.room:room-ktx:2.5.2")
}

Oda'nın artık eş yordam kullandığı birkaç örneği aşağıda görebilirsiniz. İlk örnekte User nesnelerinin listesini döndürmek için bir suspend işlevi kullanılırken, ikinci örnekte User listesini eşzamansız olarak döndürmek için Kotlin Flow işlevi kullanılmıştır. Flow kullanırken, sorguladığınız tablolardaki değişikliklerle ilgili bildirim de alırsınız.

@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>

@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>

SQLite KTX

SQLite uzantıları, işlemlerde SQL ile ilgili kodları sarmalayarak birçok standart kodu ortadan kaldırır.

Bu modülü kullanmak için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:

Eğlenceli

dependencies {
    implementation "androidx.sqlite:sqlite-ktx:2.3.1"
}

Kotlin

dependencies {
    implementation("androidx.sqlite:sqlite-ktx:2.3.1")
}

Aşağıda, veritabanı işlemi gerçekleştirmek için transaction uzantısının kullanımıyla ilgili bir örnek verilmiştir:

db.transaction {
    // insert data
}

ViewModel KTX

ViewModel KTX kitaplığı, ViewModel cihazınızdan eşleşenleri başlatmayı kolaylaştıran bir viewModelScope() işlevi sunar. CoroutineScope, Dispatchers.Main öğesine bağlıdır ve ViewModel temizlendiğinde otomatik olarak iptal edilir. Her ViewModel için yeni bir kapsam oluşturmak yerine viewModelScope() kullanabilirsiniz.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakini ekleyin:

Eğlenceli

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2"
}

Kotlin

dependencies {
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2")
}

Örneğin, aşağıdaki viewModelScope() işlevi, arka plan iş parçacığında ağ isteği yapan bir eş yordamı başlatır. Kitaplık tüm kurulum ve ilgili kapsam temizleme işlemlerini gerçekleştirir:

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()
}

WorkManager KTX

WorkManager KTX, eş yordamlar için birinci sınıf destek sağlar.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakini ekleyin:

Eğlenceli

dependencies {
    implementation "androidx.work:work-runtime-ktx:2.8.1"
}

Kotlin

dependencies {
    implementation("androidx.work:work-runtime-ktx:2.8.1")
}

Worker'i uzatmak yerine artık biraz farklı bir API'ye sahip olan CoroutineWorker'i genişletebilirsiniz. Örneğin, bazı ağ işlemlerini gerçekleştirmek için basit bir CoroutineWorker oluşturmak istiyorsanız aşağıdakileri yapabilirsiniz:

class CoroutineDownloadWorker(context: Context, params: WorkerParameters)
        : CoroutineWorker(context, params) {

    override suspend fun doWork(): Result = coroutineScope {
        val jobs = (0 until 100).map {
            async {
                downloadSynchronously("https://www.google.com")
            }
        }

        // awaitAll will throw an exception if a download fails, which
        // CoroutineWorker will treat as a failure
        jobs.awaitAll()
        Result.success()
    }
}

CoroutineWorker kullanımıyla ilgili daha fazla bilgi için CoroutineWorker'da ileti dizisi oluşturma bölümüne bakın.

WorkManager KTX, mevcut eş yordamı askıya almak için Operations ve ListenableFutures öğelerine de uzantı işlevleri ekler.

enqueue() tarafından döndürülen Operation öğesini askıya alan bir örneği burada bulabilirsiniz:

// Inside of a coroutine...

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

// Resume after work completes...

Diğer KTX modülleri

AndroidX dışındaki KTX modüllerini de dahil edebilirsiniz.

Firebase KTX

Android için Firebase SDK'larından bazıları, uygulamanızda Firebase'i kullanırken deyimsel Kotlin kodu yazmanıza olanak tanıyan Kotlin uzantı kitaplıklarına sahiptir. Daha fazla bilgi için aşağıdaki konulara bakın:

Google Haritalar Platformu KTX

Google Haritalar Platformu Android SDK'ları için KTX uzantıları bulunur. Bu uzantılar, uzantı işlevleri, adlandırılmış parametreler ve varsayılan bağımsız değişkenler, yapı bozucu bildirimler ve eş yordamlar gibi çeşitli Kotlin dili özelliklerinden yararlanmanızı sağlar. Daha fazla bilgi için aşağıdaki konulara bakın:

Core KTX oyna

Play Core KTX, Play Core kitaplığındaki SplitInstallManager ve AppUpdateManager öğelerine uzantı işlevleri ekleyerek tek seferlik istekler için Kotlin eş yordamlarını, durum güncellemelerini izlemek için de Akış'ı destekler.

Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakini ekleyin:

Modern

dependencies {
    implementation "com.google.android.play:core-ktx:1.8.1"
}

Kotlin

dependencies {
    implementation("com.google.android.play:core-ktx:1.8.1")
}

Aşağıda durum izleme Flow örneği verilmiştir:

// 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()
    }
}

Daha fazla bilgi

Android KTX hakkında daha fazla bilgi edinmek için DevBytes videosunu izleyin.

Bir sorunu bildirmek veya özellik önermek için Android KTX sorun izleyiciyi kullanın.