Android KTX Android Jetpack'in bir parçasıdır.
Android KTX, Android Jetpack ve diğer Android kitaplıklarıyla birlikte gelen bir Kotlin uzantıları kümesidir. KTX uzantıları, Jetpack, Android platformu ve diğer API'ler için kısa ve deyimsel Kotlin kodu sağlar. Bu uzantılar, bunu yapmak için aşağıdakiler de dahil olmak üzere çeşitli Kotlin dil özelliklerinden yararlanır:
- Uzantı işlevleri
- Uzantı özellikleri
- Lambda işlevleri
- Adlandırılmış parametreler
- Parametre varsayılan değerleri
- Eş yordamlar
Örneğin, SharedPreferences
ile çalışırken tercihler verilerinde değişiklik yapabilmek için düzenleyici oluşturmanız gerekir. Ayrıca düzenlemeyi bitirdiğinizde bu değişiklikleri uygulamanız veya işlemeniz gerekir. Aşağıdaki örnekte bu durum gösterilmektedir:
sharedPreferences
.edit() // create an Editor
.putBoolean("key", value)
.apply() // write to disk asynchronously
Kotlin lambda'ları bu kullanım alanı için mükemmeldir. Bunlar, düzenleyici oluşturulduktan sonra yürütülecek bir kod bloğunu ileterek, kodun yürütülmesine izin vererek ve ardından SharedPreferences
API'sinin değişiklikleri atomik olarak uygulamasına izin vererek daha kısa bir yaklaşım benimsemenize olanak tanır.
Android KTX Core işlevlerinden birine örnek olarak SharedPreferences.edit
verilebilir.
SharedPreferences.edit
, SharedPreferences
öğesine 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şken olarak alır. Ayrıca, SharedPreferences
düzenleyicide gerçekleştirilecek bir işlemi lambda biçiminde 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 uygulamayı veya reddetmeyi seçebilir. action
Lambda, SharedPreferences.Editor
üzerinde anonim bir uzantı işlevidir ve imzasıyla belirtildiği gibi Unit
değerini döndürür. Bu nedenle, blok içinde çalışmayı doğrudan SharedPreferences.Editor
üzerinde yapabilirsiniz.
Son olarak, SharedPreferences.edit()
imza inline
anahtar kelimesini içeriyor.
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 yapması) gerektiğini söyler.
Bu, işlev her çağrıldığında action
her
zaman yeni bir sınıf oluşturmanın ek yükünü önler.
Lambda'lar kullanarak kod iletme, geçersiz kılınabilecek mantıklı varsayılanlar uygulama ve inline
uzantı işlevlerini kullanarak bu davranışları mevcut API'lere ekleme, Android KTX kitaplığının sağladığı geliştirmeler için tipik bir yöntemdir.
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:
Groovy
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üzenlenir.
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ıyı 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 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 bildirimi koşulları eklemez.
Core KTX
Core KTX modülü, Android çerçevesinin parçası olan ortak kitaplıklar için uzantılar sağlar. Bu kitaplıkların, build.gradle
'ya 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.16.0" }
Kotlin
dependencies { implementation("androidx.core:core-ktx:1.16.0") }
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
Collection uzantıları, ArrayMap
, LongSparseArray
, LruCache
ve diğerleri dahil olmak üzere Android'in belleği verimli kullanma koleksiyon kitaplıklarıyla çalışmaya yönelik 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.5.0" }
Kotlin
dependencies { implementation("androidx.collection:collection-ktx:1.5.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.8.8" }
Kotlin
dependencies { implementation("androidx.fragment:fragment-ktx:1.8.8") }
Fragment KTX modülüyle, lambda'lar kullanarak 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
özellik temsilcilerini kullanarak tek satırda ViewModel
öğesine 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.9.1" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.9.1") }
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üzde sunmak isteyebilirsiniz. Bu durumlarda LiveData KTX, liveData
oluşturucu işlevi sağlar. Bu işlev, suspend
işlevini çağırır ve sonucu LiveData
nesnesi olarak sunar.
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.9.1" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.9.1") }
Aşağıdaki örnekte loadUser()
, başka bir yerde tanımlanmış bir askıya alma işlevidir.
liveData
oluşturucu işlevini kullanarak loadUser()
işlevini eşzamansız olarak çağırabilir,
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)
}
Eş yordamları LiveData
ile kullanma hakkında daha fazla bilgi için Kotlin eş yordamlarını mimari bileşenlerle 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.9.1" implementation "androidx.navigation:navigation-fragment-ktx:2.9.1" implementation "androidx.navigation:navigation-ui-ktx:2.9.1" }
Kotlin
dependencies { implementation("androidx.navigation:navigation-runtime-ktx:2.9.1") implementation("androidx.navigation:navigation-fragment-ktx:2.9.1") implementation("androidx.navigation:navigation-ui-ktx:2.9.1") }
Hedef bağımsız değişkenlerine erişmek ve hedeflere gitmek için aşağıdaki örnekte gösterildiği gibi uzantı işlevlerini ve özellik temsilini 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 LiveData
yayıncıdan
ReactiveStreams
gözlemlenebilir bir yayın 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.9.1" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.9.1") }
Örnek olarak, küçük bir kullanıcı listesi içeren bir veritabanı olduğunu varsayalım. Uygulamanızda veritabanını belleğe yükleyip kullanıcı verilerini kullanıcı arayüzünüzde gösteriyorsunuz. 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 yaşam döngüsü boyunca yönetmeniz gerekir.
Ancak LiveDataReactiveStreams
ile aşağıdaki örnekte gösterildiği gibi LiveData
'nin basitliğinden yararlanırken RxJava'nın ve zengin operatör kümesinin yanı sıra iş planlama özelliklerinden de faydalanabilirsiniz:
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.7.2" }
Kotlin
dependencies { implementation("androidx.room:room-ktx:2.7.2") }
Aşağıda, Room'un artık eş yordamları kullandığı birkaç örnek verilmiştir. İlk örnek, User
nesnelerinin listesini döndürmek için suspend
işlevini kullanırken ikinci örnek, User
listesini eşzamansız olarak döndürmek için Kotlin'in Flow
işlevini kullanır. Flow
'yı kullanırken sorguladığınız tablolardaki değişiklikler hakkında da bildirim 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ı, SQL ile ilgili kodu işlemlere sararak çok sayıda 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.5.2" }
Kotlin
dependencies { implementation("androidx.sqlite:sqlite-ktx:2.5.2") }
transaction
uzantısını kullanarak veritabanı işlemi yapma örneğini aşağıda bulabilirsiniz:
db.transaction {
// insert data
}
ViewModel KTX
ViewModel KTX kitaplığı, viewModelScope()
işlevi sağlayarak ViewModel
'nizden coroutines başlatmayı kolaylaştırır. CoroutineScope
, Dispatchers.Main
'e 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ğıdakileri ekleyin:
Groovy
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.1" }
Kotlin
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.9.1") }
Örneğin, aşağıdaki viewModelScope()
işlevi, arka plan iş parçacığında ağ isteğinde bulunan bir ortak yordam başlatır. Kitaplık, kurulumun tamamını 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, coroutine'ler 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:
Eski
dependencies { implementation "androidx.work:work-runtime-ktx:2.10.2" }
Kotlin
dependencies { implementation("androidx.work:work-runtime-ktx:2.10.2") }
Artık Worker
yerine biraz farklı bir API'ye sahip olan CoroutineWorker
'ı uzatabilirsiniz. Ö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 coroutine'i askıya almak için Operations
ve ListenableFutures
öğelerine uzantı işlevleri de ekler.
enqueue()
tarafından döndürülen Operation
'ı askıya alan bir örneği aşağıda 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'in dışında bulunan ek KTX modüllerini de dahil edebilirsiniz.
Firebase KTX
Android için Firebase SDK'larının 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 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 ç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
öğelerine uzantı işlevleri ekleyerek tek seferlik istekler için Kotlin eşzamanlı rutinleri ve durum güncellemelerini izlemek için Flow desteği sunar.
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.