Android KTX Android Jetpack'in bir parçasıdır.
Android KTX, Android Jetpack ve diğer Android kitaplıklarına dahil olan bir dizi Kotlin uzantısıdır. KTX uzantıları, Jetpack, Android platformu ve diğer API'ler için kısa ve doğal Kotlin sağlar. Bu uzantılar, bunu yapmak için aşağıdakiler dahil olmak üzere çeşitli Kotlin dil ö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 düzenleyici oluşturmanız gerekir. Bu değişiklikleri, aşağıdaki örnekte gösterildiği gibi, düzenlemeyi bitirdikten sonra da 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çim. Düzenleyici oluşturulduktan sonra çalıştırılacak bir kod bloğu ileterek, kodun çalıştırılmasına izin verip ardından SharedPreferences
API'nin değişiklikleri atomik olarak uygulamasını sağlayarak daha kısa bir yaklaşım benimsemenize olanak tanır.
Android KTX Core işlevlerinden birine örnek olarak, SharedPreferences
öğesine bir düzenleme işlevi ekleyen SharedPreferences.edit
işlevini burada bulabilirsiniz. Bu işlev, ilk bağımsız değişkeni olarak değişikliklerin kaydedilip kaydedilmeyeceğini veya uygulanıp uygulanmayacağını belirten isteğe bağlı bir boolean
işareti alır. Ayrıca, SharedPreferences
düzenleyicide gerçekleştirilecek bir işlem de lambda biçiminde alını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 kişi, değişiklikleri kaydetmeyi veya uygulamayı seçebilir. action
lambda, SharedPreferences.Editor
ürününde imza olarak belirtildiği gibi Unit
değerini döndüren anonim bir uzantı işlevidir. Bu nedenle, blokun içinde işleri 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şlevin derlenmiş bayt kodunu kopyalayıp yapıştırması (veya satır içi olarak yerleştirmesi) gerektiğini söyler.
Bu sayede, işlev her çağrıldığında her action
için yeni bir sınıf oluşturma yükü ortadan kaldırılır.
Lambda kullanarak kod aktarma, geçersiz kılınabilen makul varsayılanlar uygulama ve bu davranışları inline
uzantı işlevlerini kullanarak mevcut API'lere ekleme, Android KTX kitaplığı tarafından sağlanan geliştirmelere özgüdür.
Projenizde Android KTX'i kullanma
Android KTX'yi kullanmaya başlamak için projenizin build.gradle
dosyasına aşağıdaki bağımlılığı ekleyin:
Groovy
repositories { google() }
Kotlin
repositories { google() }
AndroidX Modülleri
Android KTX, her biri bir veya daha fazla paket içeren modüller halinde düzenlenir.
Uygulamanızın build.gradle
dosyasına 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 son sürüm numaralarını bu konudaki her bir 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ı sağlayan tek çekirdekli bir modül içerir.
Temel modül hariç tüm KTX modülü yapıları, build.gradle
dosyanızdaki temel Java bağımlılığını değiştirir. Örneğin, androidx.fragment:fragment
bağımlılığını androidx.fragment:fragment-ktx
ile değiştirebilirsiniz. Bu söz dizimi, sürüm yönetimini daha iyi yönetmenize yardımcı olur ve ek bağımlılık beyanı koşulları eklemez.
Core KTX
Core KTX modülü, Android çerçevesinin bir parçası olan yaygın kitaplıklar için uzantılar sağlar. Bu kitaplıklarda, build.gradle
'e eklemeniz gereken Java tabanlı bağımlılık yoktur.
Bu modülü dahil etmek için uygulamanızın build.gradle
dosyasına aşağıdakileri ekleyin:
Eski
dependencies { implementation "androidx.core:core-ktx:1.13.1" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:1.13.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 ArrayMap
, LongSparseArray
, LruCache
ve diğerleri gibi bellek tasarruflu koleksiyon kitaplıklarıyla çalışmak için yardımcı işlevler 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.4.5" }
Kotlin
dependencies { implementation("androidx.collection:collection-ktx:1.4.5") }
Koleksiyon uzantıları, aşağıdaki örnekte gösterildiği gibi toplama birleştirme gibi işlemleri basitleştirmek için Kotlin'in operatör aşırı yüklemesinden faydalanı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ü, fragman API'sini basitleştirmek için bir dizi uzantı sunar.
Bu modülü dahil etmek için aşağıdaki kodu uygulamanızın build.gradle
dosyasına ekleyin:
Eski
dependencies { implementation "androidx.fragment:fragment-ktx:1.8.3" }
Kotlin
dependencies { implementation("androidx.fragment:fragment-ktx:1.8.3") }
Fragment KTX modülüyle, lambdalarla parça işlemlerini basitleştirebilirsiniz. Örneğin:
fragmentManager().commit {
addToBackStack("...")
setCustomAnimations(
R.anim.enter_anim,
R.anim.exit_anim)
add(fragment, "...")
}
viewModels
ve activityViewModels
mülk temsilcilerini kullanarak tek satırda bir ViewModel
'e de bağlanabilirsiniz:
// 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, her Lifecycle
nesnesi için bir LifecycleScope
tanımlar. Bu kapsamda başlatılan tüm coroutine'ler, Lifecycle
yok edildiğinde iptal edilir. lifecycle.coroutineScope
veya lifecycleOwner.lifecycleScope
mülklerini 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.8.7" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.7") }
Aşağıdaki örnekte, önceden hesaplanmış metinleri ayarlamak için lifecycleOwner.lifecycleScope
işlevinin 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 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 durumlarda LiveData KTX, 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.8.7" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.7") }
Aşağıdaki örnekte loadUser()
, başka bir yerde tanımlanmış bir askıya alma işlevidir.
loadUser()
işlevini asenkron olarak çağırmak için liveData
oluşturucu işlevini, 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.
KTX'te gezinme
Gezinme kitaplığının her bileşeninin, API'yi daha kısa ve Kotlin diline uygun 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:
Eski
dependencies { implementation "androidx.navigation:navigation-runtime-ktx:2.8.1" implementation "androidx.navigation:navigation-fragment-ktx:2.8.1" implementation "androidx.navigation:navigation-ui-ktx:2.8.1" }
Kotlin
dependencies { implementation("androidx.navigation:navigation-runtime-ktx:2.8.1") implementation("androidx.navigation:navigation-fragment-ktx:2.8.1") implementation("androidx.navigation:navigation-ui-ktx:2.8.1") }
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 mülk 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
Palette KTX modülü, renk paletleriyle çalışmak için doğal 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
renk paletini alabilirsiniz:
val palette = Palette.from(bitmap).generate()
val swatch = palette[target]
Reactive Streams KTX
Reactive Streams KTX modülü, bir ReactiveStreams
yayıncıdan 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.8.7" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.7") }
Örneğin, az sayıda kullanıcı içeren bir veritabanını ele alalım. 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, Rx yayıncı aboneliğini de parçanızın veya etkinliğinizin ömrü boyunca yönetmeniz gerekir.
Ancak LiveDataReactiveStreams
ile, aşağıdaki örnekte gösterildiği gibi LiveData
'un basitliğiyle çalışırken RxJava ve zengin operatör grubu ile iş planlama özelliklerinden yararlanabilirsiniz:
val fun getUsersLiveData() : LiveData<List<User>> {
val users: Flowable<List<User>> = dao.findUsers()
return LiveDataReactiveStreams.fromPublisher(users)
}
Oda KTX'i
Room uzantıları, veritabanı işlemleri için coroutine desteği ekler.
Bu modülü kullanmak için uygulamanızın build.gradle
dosyasına aşağıdakileri ekleyin:
Eski
dependencies { implementation "androidx.room:room-ktx:2.6.1" }
Kotlin
dependencies { implementation("androidx.room:room-ktx:2.6.1") }
Room'un artık coroutine'leri kullandığı birkaç örnek aşağıda verilmiştir. İ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'in Flow
işlevi kullanılır. Flow
kullanırken sorguladığınız tablolardaki değişikliklerden de haberdar edileceğ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ı, işlemlerde SQL ile ilgili kodları sarmalayarak çok fazla ortak kod ortadan kaldırır.
Bu modülü kullanmak için uygulamanızın build.gradle
dosyasına şunu ekleyin:
Eski
dependencies { implementation "androidx.sqlite:sqlite-ktx:2.4.0" }
Kotlin
dependencies { implementation("androidx.sqlite:sqlite-ktx:2.4.0") }
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
'inizden coroutine'leri başlatmayı kolaylaştıran bir viewModelScope()
işlevi sağlar. CoroutineScope
, Dispatchers.Main
'a bağlıdır ve ViewModel
temizlendiğinde otomatik olarak iptal edilir. Her bir 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:
Eski
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.5" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.5") }
Örnek olarak, aşağıdaki viewModelScope()
işlevi arka plan ileti dizisinde ağ isteği gönderen bir eş yordam başlatır. Kitaplık, tüm kurulum işlemlerini ve ilgili kapsam temizleme işlemlerini yönetir:
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'i
WorkManager KTX, iş parçacığı için birinci sınıf destek sağlar.
Bu modülü dahil etmek için aşağıdaki kodu uygulamanızın build.gradle
dosyasına ekleyin:
Eski
dependencies { implementation "androidx.work:work-runtime-ktx:2.9.1" }
Kotlin
dependencies { implementation("androidx.work:work-runtime-ktx:2.9.1") }
Worker
uzantısını genişletmek yerine artık biraz farklı bir API'ye sahip CoroutineWorker
platformunu 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
kullanma hakkında daha fazla bilgi için CoroutineWorker'da iş parçacığı oluşturma başlıklı makaleyi inceleyin.
WorkManager KTX, mevcut iş parçacığının askıya alınması için Operations
ve ListenableFutures
işlevlerine de uzantı işlevleri ekler.
enqueue()
tarafından döndürülen Operation
öğesini askıya alan bir örnek aşağıda 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ışındaki ek KTX modüllerini de ekleyebilirsiniz.
Firebase KTX
Android için Firebase SDK'larından bazıları, uygulamanızda Firebase kullanırken deyimsel Kotlin kodu yazmanıza olanak tanıyan Kotlin uzantı kitaplıklarına sahiptir. Daha fazla bilgi için aşağıdaki konuları inceleyin:
Google Haritalar Platformu KTX
Google Haritalar Platformu Android SDK'ları için uzantı işlevleri, adlandırılmış parametreler ve varsayılan bağımsız değişkenler, yapı bozma bildirimleri ve iş parçacıkları gibi çeşitli Kotlin dil özelliklerinden yararlanmanıza olanak tanıyan KTX uzantıları mevcuttur. Daha fazla bilgi için aşağıdaki konulara bakın:
Play Core KTX
Play Core KTX, Play Core kitaplığındaki SplitInstallManager
ve AppUpdateManager
işlevlerine uzantı işlevleri ekleyerek tek seferlik istekler için Kotlin coroutine'leri ve durum güncellemelerini izlemek için Flow'u destekler.
Bu modülü dahil etmek için uygulamanızın build.gradle
dosyasına aşağıdakileri ekleyin:
Groovy
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 sorun izleyiciyi kullanın.