Android KTX Android Jetpack'in bir parçasıdır.
Android KTX, Android Jetpack ve diğer Android kitaplıklarında bulunan bir Kotlin uzantıları kümesidir. KTX uzantıları; Jetpack'e, Android platformuna ve diğer API'lere kısa ve özlü, deyimsel Kotlin bağlantısı sağlar. Bunun için bu uzantılar, 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. Aşağıdaki örnekte gösterildiği gibi, bu değişiklikleri düzenlemeyi bitirdiğinizde de uygulamanız veya kaydetmeniz gerekir:
sharedPreferences
.edit() // create an Editor
.putBoolean("key", value)
.apply() // write to disk asynchronously
Kotlin lambdaları bu kullanım alanı için mükemmel bir çözümdür. Düzenleyici oluşturulduktan sonra yürütülecek bir kod bloğu 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 uygulayabilirsiniz.
SharedPreferences
öğesine bir düzenleme işlevi ekleyen Android KTX Temel işlevlerinden biri olan SharedPreferences.edit
örneğini burada bulabilirsiniz. Bu işlev, değişikliklerin kaydedilip 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ştirme işlemi 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 kişi, 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.
Böylece, bu işlevin her çağrılışında her action
için yeni bir sınıf somutlaştırma yükü ortadan kalkar.
Lambda'lar kullanarak kod geçirme, geçersiz kılınabilen makul varsayılanlar uygulama ve bu davranışların inline
uzantı işlevlerini kullanarak mevcut API'lere eklenmesi, Android KTX kitaplığı tarafından sağlanan geliştirmelerin tipik bir örneğidir.
Projenizde Android KTX 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ındaki 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 için Kotlin uzantıları ve alana özgü çeşitli uzantılar sağlayan tek temel bir modül içerir.
Çekirdek 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 ek bağımlılık bildirimi gereklilikleri sağlamaz.
Çekirdek KTX
Çekirdek KTX modülü, Android çerçevesinin parçası olan ortak kitaplıklar için uzantılar sağlar. Bu kitaplıklar, build.gradle
ürününe eklemeniz gereken Java tabanlı bağımlılıklara sahip değildir.
Bu modülü dahil etmek için aşağıdaki kodu uygulamanızın build.gradle
dosyasına ekleyin:
Modern
dependencies { implementation "androidx.core:core-ktx:1.13.1" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:1.13.1") }
Çekirdek 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 olarak değişir
KTX Koleksiyonu
Koleksiyon uzantıları, Android'in ArrayMap
, LongSparseArray
, LruCache
ve diğerleri gibi bellek verimliliği yüksek toplama kitaplıklarıyla çalışmak için yardımcı olacak işlevler içerir.
Bu modülü kullanmak için uygulamanızın build.gradle
dosyasına aşağıdakileri ekleyin:
Eski
dependencies { implementation "androidx.collection:collection-ktx:1.4.3" }
Kotlin
dependencies { implementation("androidx.collection:collection-ktx:1.4.3") }
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üklemesi özelliğinden 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ü, Fragment API'yi basitleştirmek için çeşitli uzantılar sunar.
Bu modülü dahil etmek için aşağıdaki kodu uygulamanızın build.gradle
dosyasına ekleyin:
Modern
dependencies { implementation "androidx.fragment:fragment-ktx:1.8.2" }
Kotlin
dependencies { implementation("androidx.fragment:fragment-ktx:1.8.2") }
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ü için yetki verilmiş kullanıcıları 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>()
KTX Yaşam Döngüsü
Yaşam döngüsü KTX, her bir Lifecycle
nesnesi için bir LifecycleScope
tanımlar. Bu kapsamda başlatılan tüm eş yordamlar, 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 aşağıdaki kodu uygulamanızın build.gradle
dosyasına ekleyin:
Eski
dependencies { implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.4" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.4") }
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 öğrenmek ve bunları kullanıcı arayüzünüze sunmak isteyebilirsiniz. Böyle 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 aşağıdaki kodu uygulamanızın build.gradle
dosyasına ekleyin:
Eski
dependencies { implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.4" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.4") }
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 yayınlamak 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şenlerle kullanma bölümüne bakın.
Navigasyon KTX
Gezinme kitaplığının her bileşeninin, API'yi daha kısa ve öz ve Kotlin deyimine 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:
Modern
dependencies { implementation "androidx.navigation:navigation-runtime-ktx:2.7.7" implementation "androidx.navigation:navigation-fragment-ktx:2.7.7" implementation "androidx.navigation:navigation-ui-ktx:2.7.7" }
Kotlin
dependencies { implementation("androidx.navigation:navigation-runtime-ktx:2.7.7") implementation("androidx.navigation:navigation-fragment-ktx:2.7.7") implementation("androidx.navigation:navigation-ui-ktx:2.7.7") }
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)
}
}
...
}
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:
Modern
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 aşağıdaki kodu uygulamanızın build.gradle
dosyasına ekleyin:
Eski
dependencies { implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.4" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.4") }
Örneğin, kullanıcı sayısının az olduğu 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. Bunun 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
sayesinde RxJava, zengin operatör kümesi ve iş planlama özelliklerinden yararlanırken aynı zamanda 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)
}
Odanın Anahtar Kelimesi
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:
Eski
dependencies { implementation "androidx.room:room-ktx:2.6.1" }
Kotlin
dependencies { implementation("androidx.room:room-ktx:2.6.1") }
Aşağıda, Room'un artık eş yordam kullandığı birkaç örnek verilmiştir. İlk örnek, User
nesnelerinin listesini döndürmek için suspend
işlevi kullanırken, ikinci örnekte User
listesini eşzamansız olarak döndürmek için Kotlin Flow
işlevi kullanılır. Flow
kullanıldığında, 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 kodu 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:
Eski
dependencies { implementation "androidx.sqlite:sqlite-ktx:2.4.0" }
Kotlin
dependencies { implementation("androidx.sqlite:sqlite-ktx:2.4.0") }
Bir veritabanı işlemi gerçekleştirmek için transaction
uzantısının nasıl kullanıldığıyla ilgili bir örneği burada bulabilirsiniz:
db.transaction {
// insert data
}
ViewModel KTX
ViewModel KTX kitaplığı, ViewModel
cihazınızdan eşdeğer eşleri başlatmayı kolaylaştıran bir viewModelScope()
işlevi sağlar. CoroutineScope
, Dispatchers.Main
öğesine bağlıdır ve ViewModel
silindiğinde otomatik olarak iptal edilir. Her ViewModel
için yeni bir kapsam oluşturmak yerine viewModelScope()
öğesini kullanabilirsiniz.
Bu modülü dahil etmek için aşağıdaki kodu uygulamanızın build.gradle
dosyasına ekleyin:
Eski
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4") }
Örnek olarak, aşağıdaki viewModelScope()
işlevi, arka plan iş parçacığında ağ isteği gönderen bir eş ütü başlatır. Kitaplık tüm ayarları 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 aşağıdaki kodu uygulamanızın build.gradle
dosyasına ekleyin:
Modern
dependencies { implementation "androidx.work:work-runtime-ktx:2.9.1" }
Kotlin
dependencies { implementation("androidx.work:work-runtime-ktx:2.9.1") }
Worker
'i genişletmek yerine artık biraz farklı bir API'ye sahip olan CoroutineWorker
öğesini 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 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 ek 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ı içerir. Daha fazla bilgi için aşağıdaki konuları inceleyin:
Google Haritalar Platformu KTX
Google Haritalar Platformu Android SDK'ları için KTX uzantıları mevcuttur. Bu 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 Kotlin dilindeki çeşitli özelliklerden yararlanmanızı sağlar. Daha fazla bilgi için aşağıdaki konulara bakın:
Core KTX oyna
Play Core KTX, tek seferlik istekler için Kotlin eş yordamlarını, Play Core kitaplığındaki SplitInstallManager
ve AppUpdateManager
öğelerine uzantı işlevleri ekleyerek durum güncellemelerini izlemek için de Flow desteği sunar.
Bu modülü dahil etmek için aşağıdaki kodu uygulamanızın build.gradle
dosyasına 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 izlemeyle ilgili bir 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 önerisinde bulunmak için Android KTX Issue Tracker'ı kullanın.