Android KTX Android Jetpack'in bir parçasıdır.
Android KTX, Android Jetpack ve diğer Android kitaplıklarına dahil edilen bir Kotlin uzantıları grubudur. KTX uzantıları; Jetpack, Android platformu ve diğer API'ler için kısa ve deyimsel Kotlin sağlar. Bu uzantılar, bu amaçla aşağıdakiler de 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. Ayrıca, düzenlemeyi tamamladığınızda bu değişiklikleri uygulamanız veya kaydetmeniz gerekir. Aşağıdaki örnekte bu işlem gösterilmektedir:
sharedPreferences
.edit() // create an Editor
.putBoolean("key", value)
.apply() // write to disk asynchronously
Kotlin lambda'ları bu kullanım alanı için idealdir. Bu yöntemler, düzenleyici oluşturulduktan sonra yürütülecek bir kod bloğu ileterek, kodun yürütülmesine izin vererek ve ardından SharedPreferences API'nin değişiklikleri atomik olarak uygulamasına izin vererek daha kısa bir yaklaşım benimsemenize olanak tanır.
Android KTX Core işlevlerinden biri olan SharedPreferences.edit, SharedPreferences sınıfına bir düzenleme işlevi ekler. Bu işlev, değişikliklerin uygulanıp uygulanmayacağını belirten isteğe bağlı bir boolean işaretini ilk bağımsız değişkeni olarak alır. Ayrıca, lambda biçiminde SharedPreferences düzenleyicide gerçekleştirilecek bir işlem 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 onaylamayı veya uygulamayı seçebilir. action
lambda, imzasında belirtildiği gibi Unit döndüren SharedPreferences.Editor
üzerinde anonim bir uzantı işlevidir. Bu nedenle, blok içinde doğrudan SharedPreferences.Editor üzerinde çalışabilirsiniz.
Son olarak, SharedPreferences.edit() imzasında inline anahtar kelimesi yer alır.
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çine alması) gerektiğini bildirir.
Bu sayede, bu işlev her çağrıldığında her action için yeni bir sınıf örneklendirme yükü ortadan kalkar.
Lambda'ları kullanarak kod iletme, geçersiz kılınabilecek mantıklı varsayılanlar uygulama ve bu davranışları inlineuzantı işlevlerini kullanarak mevcut API'lere ekleme kalıbı, Android KTX kitaplığının sağladığı 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ında her modül yapısı için bir bağımlılık eklemeniz gerekir. Sürüm numarasını yapıya eklemeyi unutmayın.
En yeni sürüm numaralarını bu konudaki her bir yapının ilgili bölümünde bulabilirsiniz.
Android KTX, yaygın çerçeve API'leri için Kotlin uzantıları ve alana özgü çeşitli uzantılar sağlayan tek bir temel modül içerir.
Çekirdek modül hariç tüm KTX modülü yapıları, build.gradle dosyanızdaki temel Java bağımlılığının yerini alır. Örneğin, 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 ek bağımlılık beyanı şartları eklemez.
Core KTX
Core KTX modülü, Android çerçevesinin parçası olan yaygın kitaplıklar için uzantılar sağlar. Bu kitaplıkların build.gradle dosyasına eklemeniz gereken Java tabanlı bağımlılıkları yoktur.
Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:
Groovy
dependencies { implementation "androidx.core:core-ktx:1.19.1" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:1.19.1") }
Core KTX modülünde bulunan paketlerin listesi aşağıda verilmiştir:
- androidx.core.animation
- androidx.core.content
- androidx.core.content.res
- androidx.core.database
- androidx.core.database.sqlite
- androidx.core.graphics
- androidx.core.graphics.drawable
- androidx.core.location
- androidx.core.net
- androidx.core.os
- androidx.core.text
- androidx.core.transition
- androidx.core.util
- androidx.core.view
- androidx.core.widget
Collection KTX
Koleksiyon uzantıları, Android'in belleği verimli kullanan koleksiyon kitaplıklarıyla (ArrayMap, LongSparseArray, LruCache vb.) çalışmak için hizmet işlevleri içerir.
Bu modülü kullanmak için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:
Groovy
dependencies { implementation "androidx.collection:collection-ktx:1.6.0" }
Kotlin
dependencies { implementation("androidx.collection:collection-ktx:1.6.0") }
Koleksiyon uzantıları, aşağıdaki örnekte gösterildiği gibi koleksiyon birleştirme gibi işlemleri basitleştirmek için Kotlin'in operatör 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
Fragment KTX
Fragment KTX modülü, fragment API'yi basitleştirmek için çeşitli uzantılar sağlar.
Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:
Eski
dependencies { implementation "androidx.fragment:fragment-ktx:1.9.1" }
Kotlin
dependencies { implementation("androidx.fragment:fragment-ktx:1.9.1") }
Fragment KTX modülüyle, lambda'ları kullanarak fragment işlemlerini basitleştirebilirsiniz. Örneğin:
fragmentManager().commit {
addToBackStack("...")
setCustomAnimations(
R.anim.enter_anim,
R.anim.exit_anim)
add(fragment, "...")
}
viewModels ve activityViewModels özellik temsilcilerini kullanarak tek bir satırda ViewModel görünümüne de 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>()
Lifecycle KTX
Lifecycle KTX, her Lifecycle nesnesi için bir LifecycleScope tanımlar. Bu kapsamda başlatılan tüm eş yordamlar, Lifecycle yok edildiğinde iptal edilir. lifecycle.coroutineScope veya lifecycleOwner.lifecycleScope özelliklerini kullanarak Lifecycle öğesinin CoroutineScope özelliğine erişebilirsiniz.
Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.11.0" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.11.0") }
Aşağıdaki örnekte, önceden hesaplanmış metni eşzamansız olarak oluşturmak için lifecycleOwner.lifecycleScope öğesinin nasıl kullanılacağı gösterilmektedir:
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'yı kullanırken değerleri eşzamansız olarak hesaplamanız gerekebilir. Örneğin, bir kullanıcının tercihlerini alıp kullanıcı arayüzünüze sunmak isteyebilirsiniz. Bu gibi durumlarda LiveData KTX, bir suspend işlevini ç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ğıdakileri ekleyin:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.11.0" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.11.0") }
Aşağıdaki örnekte loadUser(), başka bir yerde tanımlanmış bir askıya alma işlevidir.
loadUser() işlevini eşzamansız olarak çağırmak için liveData oluşturucu işlevini kullanabilir, ardından sonucu yayınlamak için emit() işlevini 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 başlıklı makaleyi inceleyin.
Navigation KTX
Navigation kitaplığının her bileşeninin, API'yi daha kısa ve Kotlin'e özgü 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:
Groovy
dependencies { implementation "androidx.navigation:navigation-runtime-ktx:2.10.2" implementation "androidx.navigation:navigation-fragment-ktx:2.10.2" implementation "androidx.navigation:navigation-ui-ktx:2.10.2" }
Kotlin
dependencies { implementation("androidx.navigation:navigation-runtime-ktx:2.10.2") implementation("androidx.navigation:navigation-fragment-ktx:2.10.2") implementation("androidx.navigation:navigation-ui-ktx:2.10.2") }
Aşağıdaki örnekte gösterildiği gibi, hedef bağımsız değişkenlerine 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)
}
}
...
}
Palette KTX
Palette 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:
Eski
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 örneğini alabilirsiniz:
val palette = Palette.from(bitmap).generate()
val swatch = palette[target]
Reactive Streams KTX
Reactive Streams KTX modülü, bir ReactiveStreams yayıncısından gözlemlenebilir bir LiveData akışı oluşturmanıza olanak tanır.
Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.11.0" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.11.0") }
Örnek olarak, küçük bir kullanıcı listesi içeren bir veritabanı düşünelim. Uygulamanızda veritabanını belleğe yükler ve ardından kullanıcı verilerini kullanıcı arayüzünüzde gösterirsiniz. Bunu yapmak için RxJava'yı kullanabilirsiniz.
Room Jetpack bileşeni, kullanıcı listesini Flowable olarak alabilir. Bu senaryoda, fragment veya etkinliğinizin ömrü boyunca Rx yayıncı aboneliğini de yönetmeniz gerekir.
Ancak LiveDataReactiveStreams ile RxJava'dan ve zengin operatör setinden ve iş planlama özelliklerinden yararlanırken aşağıdaki örnekte gösterildiği gibi LiveData'nin basitliğiyle de çalışabilirsiniz:
val fun getUsersLiveData() : LiveData<List<User>> {
val users: Flowable<List<User>> = dao.findUsers()
return LiveDataReactiveStreams.fromPublisher(users)
}
Room KTX
Room 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:
Groovy
dependencies { implementation "androidx.room:room-ktx:2.8.5" }
Kotlin
dependencies { implementation("androidx.room:room-ktx:2.8.5") }
Room'un eş yordamları kullandığı birkaç örneği aşağıda bulabilirsiniz. İlk örnekte User nesnelerinin listesini döndürmek için suspend işlevi kullanılırken ikinci örnekte User listesini eşzamansız olarak döndürmek için Kotlin'in Flow işlevi kullanılır. Flow kullanırken sorguladığınız tablolardaki değişiklikler hakkında da bilgilendirileceğinizi unutmayın.
@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>
@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>
SQLite KTX
SQLite uzantıları, SQL ile ilgili kodu işlemlere sarmalayarak ortak metin kodunun büyük bir kısmını ortadan kaldırır.
Bu modülü kullanmak için uygulamanızın build.gradle dosyasına aşağıdakileri ekleyin:
Groovy
dependencies { implementation "androidx.sqlite:sqlite-ktx:2.7.1" }
Kotlin
dependencies { implementation("androidx.sqlite:sqlite-ktx:2.7.1") }
Veritabanı işlemi gerçekleştirmek için transaction uzantısının kullanıldığı bir örneği aşağıda bulabilirsiniz:
db.transaction {
// insert data
}
ViewModel KTX
ViewModel KTX kitaplığı, ViewModel öğenizden eş yordamları başlatmayı kolaylaştıran bir viewModelScope() işlevi sağlar. CoroutineScope, Dispatchers.Main ile ilişkilidir 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ğıdakileri ekleyin:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.11.0" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.11.0") }
Ö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ğıdakileri ekleyin:
Modern
dependencies { implementation "androidx.work:work-runtime-ktx:2.12.0" }
Kotlin
dependencies { implementation("androidx.work:work-runtime-ktx:2.12.0") }
Artık Worker yerine, biraz farklı bir API'si olan CoroutineWorker sınıfını 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ı hakkında daha fazla bilgi için CoroutineWorker'da iş parçacığı oluşturma başlıklı makaleyi inceleyin.
WorkManager KTX, mevcut eş yordamı askıya almak için Operations ve ListenableFutures'ya uzantı işlevleri de ekler.
Aşağıda, enqueue() tarafından döndürülen Operation öğesini askıya alan bir örnek verilmiştir:
// 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ışında bulunan ek KTX modüllerini de dahil edebilirsiniz.
Firebase KTX
Android için Firebase SDK'larından bazılarında, uygulamanızda Firebase'i kullanırken deyimsel Kotlin kodu yazmanıza olanak tanıyan Kotlin uzantı kitaplıkları bulunur. Daha fazla bilgi için aşağıdaki konulara bakın:
Google Haritalar Platformu KTX
Google Haritalar Platformu Android SDK'ları için kullanılabilen KTX uzantıları; uzantı işlevleri, adlandırılmış parametreler ve varsayılan bağımsız değişkenler, yapı bozma bildirimleri ve eş yordamlar gibi çeşitli Kotlin dili özelliklerinden yararlanmanıza olanak tanır. Daha fazla bilgi için aşağıdaki konulara bakın:
Play Core KTX
Play Core KTX, Play Core kitaplığındaki SplitInstallManager ve AppUpdateManager sınıflarına uzantı işlevleri ekleyerek tek seferlik istekler için Kotlin eş yordamları ve durum güncellemelerini izlemek için Flow desteği ekler.
Bu modülü dahil etmek için uygulamanızın build.gradle dosyasına aşağıdakileri 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") }
Durum izleme Flow örneğini aşağıda görebilirsiniz:
// 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.
Sorun bildirmek veya özellik önermek için Android KTX Issue Tracker'ı kullanın.