Bu codelab, Android Kotlin Temelleri kursuna dahildir. Codelab'ler üzerinden sırayla çalışıyorsanız bu kurstan en iyi şekilde yararlanabilirsiniz. Tüm kurs codelab'leri Android Kotlin Fundamentals codelabs açılış sayfasında listelenmektedir.
Giriş
Bu kurstaki önceki codelab'lerde, görünümlere referans almak için findViewById()
işlevini kullandınız. Uygulamanızın karmaşık görünüm hiyerarşileri olduğunda findViewById()
pahalıdır ve uygulamayı yavaşlatır. Bunun nedeni, Android'in kökten başlayarak istenen görünümü bulana kadar görünüm hiyerarşisini geçmesini sağlamaktır. Neyse ki daha iyi bir yol var.
Görünümlerde veri ayarlamak için dize kaynaklarını kullandınız ve etkinlikten gelen verileri ayarladınız. Görüş, verileri bilirse daha verimli olacaktır. Neyse ki bunu yapmak mümkün.
Bu codelab'de, findViewById()
ihtiyacını ortadan kaldırmak için veri bağlamayı nasıl kullanacağınızı öğreneceksiniz. Ayrıca, verilere doğrudan bir görünümden erişmek için veri bağlamayı nasıl kullanacağınızı da öğrenebilirsiniz.
Bilmeniz gerekenler
Aşağıdaki konular hakkında bilgi sahibi olmalısınız:
- Etkinlik nedir ve
onCreate()
içinde düzeni olan bir etkinlik nasıl ayarlanır? - Metin görünümü oluşturma ve metin görünümündeki metni ayarlama.
- Bir görünüme referans almak için
findViewById()
kullanılıyor. - Bir görünüm için temel XML düzeni oluşturma ve düzenleme.
Neler öğreneceksiniz?
findViewById()
hizmetine yapılan verimsiz çağrıları ortadan kaldırmak için Veri Bağlama Kitaplığı'nı kullanma.- Uygulama verilerine doğrudan XML'den erişme.
Yapacaklarınız
- Bir uygulamayı,
findViewById()
yerine veri bağlama özelliğini kullanacak ve verilere doğrudan düzen XML dosyalarından erişecek şekilde değiştirin.
Bu codelab'de, HakkındaMe uygulamasıyla başlar ve uygulamayı veri bağlamayı kullanacak şekilde değiştirirsiniz. İşiniz bittiğinde uygulama tamamen aynı görünecektir.
HakkındaMe uygulamasının işlevi şöyledir:
- Kullanıcı uygulamayı açtığında, uygulama bir ad, bir takma ad girilecek alan, Bitti düğmesi, yıldız resmi ve kaydırılabilir metin gösterir.
- Kullanıcı bir takma ad girip Bitti düğmesine dokunabilir. Düzenlenebilir alan ve düğme, girilen takma adı gösteren bir metin görünümüyle değiştirilir.
Önceki codelab'de oluşturduğunuz kodu kullanabilir veya HakkındaMeDataLinking-Starter kodunu GitHub'dan indirebilirsiniz.
Önceki codelab'lerde yazdığınız kod, görüntülemelerle ilgili referanslar almak için findViewById()
işlevini kullanır.
Görünüm oluşturulduktan veya yeniden oluşturulduktan sonra bir görünüm aramak için findViewById()
öğesini her kullandığınızda Android sistemi, görünümü bulmak için çalışma zamanında görüntüleme hiyerarşisini doldurur. Uygulamanızın az sayıda görüntüleme alması sorun değildir. Ancak, üretim uygulamalarında bir düzende onlarca görünüm bulunabilir. En iyi tasarıma sahip olsalar bile iç içe yerleştirilmiş görünümler olacaktır.
Metin görünümü içeren kaydırma görünümünü içeren doğrusal bir düzen düşünün. Büyük veya derin görünüm hiyerarşisinde bir görünüm bulmak, kullanıcı için uygulamayı belirgin ölçüde yavaşlatabilecek kadar zaman alabilir. Değişkenlerdeki görünümleri önbelleğe almak size yardımcı olabilir ancak her ad alanında her görünüm için bir değişken başlatmanız gerekir. Çok sayıda görüntüleme ve birden fazla etkinlik olması da bu duruma katkı sağlar.
İyi bir çözüm, her görünüme referans içeren bir nesne oluşturmaktır. Binding
nesnesi adı verilen bu nesne, uygulamanızın tamamı tarafından kullanılabilir. Bu teknik, veri bağlama olarak adlandırılır. Uygulamanız için bir bağlayıcı nesne oluşturulduktan sonra, görünüm hiyerarşisinden geçiş yapmak veya verileri aramak zorunda kalmadan görüntüleme nesnesine, bağlama nesnesi aracılığıyla erişebilirsiniz.
Veri bağlama aşağıdaki avantajlara sahiptir:
- Kod,
findByView()
kullanan koddan daha kısa, okunması ve bakımı daha kolaydır. - Veriler ve görünümler açıkça birbirinden ayrılır. Bu kursun ilerleyen bölümlerinde veri bağlamanın avantajı giderek daha önemli hale gelecek.
- Android sistemi, her görünümü elde etmek için görüntüleme hiyerarşisinde yalnızca bir kez hareket eder ve kullanıcı uygulamayla etkileşimde bulunduğunda çalışma zamanında değil, uygulama başlatılırken gerçekleşir.
- Görüntülemelere erişmek için tür güvenliği alırsınız. (Tür güvenliği, derleyicinin derleme sırasında türleri doğruladığı ve bir değişkene yanlış türü atamaya çalıştığınızda hata verdiği anlamına gelir.)
Bu görevde veri bağlamayı ayarlamış olursunuz ve veri bağlamayı, bağlama çağrıları findViewById()
nesnesiyle değiştirmek için kullanırsınız.
1. Adım: Veri bağlamayı etkinleştirin
Veri bağlamayı varsayılan olarak etkinleştirmediğinden Gradle dosyanızda veri bağlamayı etkinleştirmeniz gerekir. Bunun nedeni, veri bağlamanın derleme süresini artırmaları ve uygulama başlatma süresini etkilemeleridir.
- Önceki bir codelab'den HakkındaMe uygulamanız yoksa GitHub'dan AboutMeDataLinking-Starter kodunu alın. Android Studio'da açın.
build.gradle (Module: app)
dosyasını açın.android
bölümünün içine kapatma bölümünden önce birdataBinding
bölümü ekleyin veenabled
öğesinitrue
olarak ayarlayın.
dataBinding {
enabled = true
}
- İstendiğinde projeyi senkronize edin. İstenmezse File > Project Gradle Files ile Senkronize Et'i seçin.
- Uygulamayı çalıştırabilirsiniz ancak herhangi bir değişiklik görmezsiniz.
2. Adım: Düzen dosyasını, veri bağlamayla kullanılabilir olacak şekilde değiştirin
Veri bağlamayla çalışmak için XML düzeninizi <layout>
etiketiyle sarmalamanız gerekir. Bunun nedeni, kök sınıfın artık bir görünüm grubu değil, görünüm grupları ve görünümleri içeren bir düzen olmasıdır. Bağlama nesnesi, düzeni ve içindeki görünümleri bilebilir.
activity_main.xml
dosyasını açın.- Metin sekmesine geçin.
<layout></layout>
öğesini<LinearLayout>
çevresindeki en dış etiket olarak ekleyin.
<layout>
<LinearLayout ... >
...
</LinearLayout>
</layout>
- Kod girintisini düzeltmek için Kod > Kodu yeniden biçimlendir'i seçin.
Bir düzenin ad alanı bildirimleri en dış etikette olmalıdır.
- Ad alanı beyanlarını
<LinearLayout>
öğesinden kesip<layout>
etiketine yapıştırın. Açılış<layout>
etiketiniz aşağıda gösterildiği gibi olmalı ve<LinearLayout>
etiketi yalnızca görüntüleme özellikleri içermelidir.
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
- İşlemi doğru şekilde yaptığınızdan emin olmak için uygulamanızı oluşturun ve çalıştırın.
3. Adım: Ana etkinlikte bir bağlama nesnesi oluşturun
Ana etkinliğe, bağlama nesnesine bir referans ekleyin. Böylece, görünüme erişmek için bu nesneyi kullanabilirsiniz:
MainActivity.kt
dosyasını açın.onCreate()
öğesinden önce, en üst düzeyde bağlama nesnesi için bir değişken oluşturun. Bu değişken normaldebinding
olarak adlandırılır.binding
sınıfının (ActivityMainBinding
sınıfı) türü, derleyici tarafından özellikle bu ana etkinlik için oluşturulur. Ad, düzen dosyasının adına göre belirlenir:activity_main + Binding
.
private lateinit var binding: ActivityMainBinding
- Android Studio tarafından istenirse
ActivityMainBinding
içe aktarın. İstenmiyorsa bu eksik sınıfı içe aktarmak içinActivityMainBinding
simgesini veAlt+Enter
düğmesine (Mac'teOption+Enter
) basın. (Daha fazla klavye kısayolu için Klavye kısayolları konusuna bakın.)import
ifadesi aşağıda gösterilene benzemelidir.
import com.example.android.aboutme.databinding.ActivityMainBinding
Ardından, mevcut setContentView()
işlevini aşağıdakileri yapan bir talimatla değiştirirsiniz:
- Bağlama nesnesini oluşturur.
activity_main
düzeniniMainActivity
ile ilişkilendirmek içinDataBindingUtil
sınıfındakisetContentView()
işlevini kullanır. BusetContentView()
işlevi, görünümler için bazı veri bağlama ayarlarını da halleder.
onCreate()
içindesetContentView()
çağrısını aşağıdaki kod satırıyla değiştirin.
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
DataBindingUtil
aktarın.
import androidx.databinding.DataBindingUtil
4. Adım: findViewById() için yapılan tüm çağrıları değiştirmek üzere bağlama nesnesini kullanın
Artık findViewById()
öğesine yapılan tüm çağrıları, bağlayıcı nesnedeki görünüm referanslarıyla değiştirebilirsiniz. Bağlama nesnesi oluşturulduğunda derleyici, bağlama nesnesindeki görünümlerin adlarını düzendeki görünümlerin kimliklerinden oluşturur ve bunları deve durumuna dönüştürür. Dolayısıyla, örneğin bağlama nesnesinde done_button
doneButton
, nickname_edit
nicknameEdit
ve nickname_text
nicknameText
olur.
onCreate()
içindedone_button
öğesini bulmak içinfindViewById()
nesnesini kullanan kodu, bağlayıcı nesnesindeki düğmeye referans veren kodla değiştirin.
Şu kodu değiştirin:findViewById<Button>(R.id.
done_button
)
şununla değiştirin:binding.doneButton
onCreate()
içinde tıklama dinleyiciyi ayarlamak için kullandığınız kod şu şekilde görünmelidir.
binding.doneButton.setOnClickListener {
addNickname(it)
}
addNickname()
işlevindekifindViewById()
öğesine yapılan tüm çağrılar için aynı işlemi yapın.findViewById<
View
>(R.id.
id_view
)
öğesinin tüm geçtiği yerleribinding.
idView
ile değiştirin. Bunu aşağıdaki şekilde yapın:
editText
venicknameTextView
değişkenlerinin tanımlarını vefindViewById()
çağrıları Bu işlemde hata alırsınız.- Hataları düzeltmek için (silinmiş değişkenler yerine)
binding
nesnesindennicknameText
,nicknameEdit
vedoneButton
görünümlerini alın. view.visibility
değerinibinding.doneButton.visibility
ile değiştirin. Girilenview
yerinebinding.doneButton
kodu kullanıldığında kod daha tutarlı hale gelir.
Sonuç şu koddur:
binding.nicknameText.text = binding.nicknameEdit.text
binding.nicknameEdit.visibility = View.GONE
binding.doneButton.visibility = View.GONE
binding.nicknameText.visibility = View.VISIBLE
- İşlevsellikte herhangi bir değişiklik yoktur. İsteğe bağlı olarak, artık
view
parametresini kaldırabilir ve tümview
kullanımını bu işlevin içinde kullanmak için güncelleyebilirsiniz.
nicknameText
içinString
gerekiyor.nicknameEdit.text
iseEditable
. Veri bağlama kullanırken,Editable
öğesini açık bir şekildeString
biçimine dönüştürmeniz gerekir.
binding.nicknameText.text = binding.nicknameEdit.text.toString()
- Devre dışı bırakılmış içe aktarmaları silebilirsiniz.
apply{}
kullanarak işlevi kotele edin.
binding.apply {
nicknameText.text = nicknameEdit.text.toString()
nicknameEdit.visibility = View.GONE
doneButton.visibility = View.GONE
nicknameText.visibility = View.VISIBLE
}
- Uygulamanızı derleyip çalıştırın...Uygulamanın öncekiyle tam olarak aynı görünmesi ve çalışması gerekir.
Bir veri sınıfının doğrudan görünümde kullanılabilmesi için veri bağlamadan yararlanabilirsiniz. Bu teknik, kodu basitleştirir ve daha karmaşık durumları ele almak açısından çok değerlidir.
Bu örnekte, dize kaynaklarını kullanarak adı ve takma adı ayarlamak yerine, ad ve takma ad için bir veri sınıfı oluşturursunuz. Veri sınıfını kullanarak, veri sınıfını görünümde kullanabilirsiniz.
1. Adım: MyName veri sınıfını oluşturun
- Android dizinindeki
java
dizinindeMyName.kt
dosyasını açın. Bu dosyaya sahip değilseniz yeni bir Kotlin dosyası oluşturupMyName.kt
dosyasını çağırın. - Ad ve takma ad için bir veri sınıfı tanımlayın. Varsayılan değer olarak boş dizeler kullanın.
data class MyName(var name: String = "", var nickname: String = "")
2. Adım: Düzene veri ekleyin
activity_main.xml
dosyasında, ad şu anda bir dize kaynağından TextView
olarak ayarlanmıştır. Adın referansını, veri sınıfındaki verilere bir referansla değiştirmeniz gerekir.
- Metin sekmesinde
activity_main.xml
uygulamasını açın. - Düzenin üst kısmında
<layout>
ve<LinearLayout>
etiketlerinin arasına bir<data></data>
etiketi ekleyin. Görünüm ile veriler arasında bağlantı kurarsınız.
<data>
</data>
Veri etiketlerinin içinde, sınıf referansı olan adlandırılmış değişkenleri belirtebilirsiniz.
<data>
etiketinin içine bir<variable>
etiketi ekleyin.- Değişkene
"myName"
adı vermek içinname
parametresi ekleyin. Birtype
parametresi ekleyin ve türü,MyName
veri sınıfının tam adı (paket adı + değişken adı) olarak ayarlayın.
<variable
name="myName"
type="com.example.android.aboutme.MyName" />
Artık ad için dize kaynağını kullanmak yerine myName
değişkenini referans alabilirsiniz.
android:text="@string/name"
kodunu aşağıdaki kodla değiştirin.
@={}
, süslü ayraçların içinde referans alınan verileri almak için kullanılan bir yönergedir.
myName
, daha önce tanımladığınız myName
değişkenini referans alır. Bu değişken, myName
veri sınıfını işaret eder ve name
özelliğini sınıftan getirir.
android:text="@={myName.name}"
3. Adım: Verileri oluşturun
Artık düzen dosyanızdaki verilere referansta bulunuyorsunuz. Ardından asıl verileri oluşturacaksınız.
MainActivity.kt
dosyasını açın.onCreate()
üzerinde, kongreye göremyName
olarak da adlandırılan özel bir değişken oluşturun. Değişkene ad ileterekMyName
veri sınıfının bir örneğini atayın.
private val myName: MyName = MyName("Aleks Haecky")
onCreate()
içinde, düzen dosyasındakimyName
değişkeninin değerini, az önce bildirdiğinizmyName
değişkeninin değerine ayarlayın. Değişkene doğrudan XML'den erişemezsiniz. Dosyaya bağlayıcı nesnesi aracılığıyla erişmeniz gerekir.
binding.myName = myName
- Değişiklik yapıldıktan sonra bağlama nesnesini yenilemeniz gerektiğinden bu bir hata gösterebilir. Uygulamanızı geliştirdiğinizde hatanın ortadan kalkmasını sağlayın.
4. Adım: TextView'da takma ad için veri sınıfını kullanın
Son adım, TextView
içindeki rumuz için veri sınıfını da kullanmaktır.
activity_main.xml
'yi açın.nickname_text
metin görünümüne birtext
özelliği ekleyin. Aşağıda gösterildiği gibi, veri sınıfındakinickname
öğesine bakın.
android:text="@={myName.nickname}"
ActivityMain
içinde rumuzumyName
değişkeninde ayarlamak içinnicknameText.text = nicknameEdit.text.toString()
yerine kod kullanın.
myName?.nickname = nicknameEdit.text.toString()
Takma ad ayarlandıktan sonra kodunuzun kullanıcı arayüzünü yeni verilerle yenilemesini istersiniz. Bunu yapmak için tüm bağlı ifadeleri, doğru verilerle yeniden oluşturulacak şekilde geçersiz kılmanız gerekir.
- Takma adı belirledikten sonra
invalidateAll()
öğesini, kullanıcı arayüzünün güncellenmiş bağlama nesnesindeki değerle yenilenmesi için ekleyin.
binding.apply {
myName?.nickname = nicknameEdit.text.toString()
invalidateAll()
...
}
- Uygulamanızı oluşturup çalıştırın. Uygulama, öncekiyle aynı şekilde çalışacaktır.
Android Studio projesi: HakkındaMeDataLinking
findViewById()
çağrıları yerine veri bağlamayı kullanma adımları:
build.gradle
dosyasının Android bölümünde veri bağlamayı etkinleştirin:dataBinding { enabled = true }
- XML düzeninizde kök görünümü olarak
<layout>
kullanın. - Bağlama değişkeni tanımlayın:
private lateinit var binding: ActivityMainBinding
MainActivity
içindesetContentView
:binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
öğesinin yerine başka bir bağlama nesnesi oluşturunfindViewById()
öğesine yapılan çağrıları, bağlama nesnesindeki görünüm referanslarıyla değiştirin. Örneğin:findViewById<Button>(R.id.done_button) ⇒ binding.doneBu
toton
(Örnekte, görünümün adı XML'de görünümid
şeklindedir.)
Görünümleri verilere bağlama adımları:
- Verileriniz için bir veri sınıfı oluşturun.
<layout>
etiketinin içine bir<data>
bloğu ekleyin.- Bir
<variable>
ve veri sınıfı olan bir tür tanımlayın.
<data>
<variable
name="myName"
type="com.example.android.aboutme.MyName" />
</data>
MainActivity
öğesinde veri sınıfının bir örneğini içeren bir değişken oluşturun. Örneğin:private val myName: MyName = MyName("Aleks Haecky")
- Bağlama nesnesinde değişkeni, yeni oluşturduğunuz değişkene ayarlayın:
binding.myName = myName
- XML'de, görünümün içeriğini
<data>
blokunda tanımladığınız değişkene ayarlayın. Veri sınıfının içindeki verilere erişmek için nokta gösterimini kullanın.android:text="@={myName.name}"
Udacity kursu:
Android geliştirici dokümanları:
Bu bölümde, bir eğitmen tarafından sunulan kurs kapsamında bu codelab üzerinden çalışan öğrenciler için olası ev ödevi ödevleri listelenmektedir. Öğretmenin şunları yapması gerekir:
- Gerekirse ev ödevini atayın.
- Öğrencilere ev ödevlerinin nasıl gönderileceğini bildirin.
- Ev ödevlerine not verin.
Öğretmenler bu önerileri istedikleri kadar kullanabilir veya uygun görebilir ve uygun olan diğer ev ödevlerini atayabilirler.
Bu codelab'de kendiniz çalışıyorsanız, bilginizi test etmek için bu ödevlerden yararlanabilirsiniz.
Bu soruları yanıtlayın
1. Soru
findViewById()
hesabına yapılan uygunsuz ve üstü kapalı aramaları neden en aza indirmek istiyorsunuz?
findViewById()
her arandığında, görüntüleme hiyerarşisi değiştirilir.findViewById()
, ana veya kullanıcı arayüzü ileti dizisinde çalışıyor.- Bu aramalar kullanıcı arayüzünü yavaşlatabilir.
- Uygulamanızın kilitlenme olasılığı daha düşüktür.
2. Soru
Veri bağlamayı nasıl tanımlarsınız?
Örneğin, veri bağlama hakkında şunları söyleyebilirsiniz:
- Veri bağlama ile ilgili en büyük fikir, derleme sırasında iki uzak mesafe bilgisini derleyen/eşleyen/bağlayan bir nesne oluşturmaktır. Böylece, çalışma zamanında verileri aramak zorunda kalmazsınız.
- Bu bağlantıları size bağlayan nesneye bağlama nesnesi adı verilir.
- Bağlama nesnesi, derleyici tarafından oluşturulur.
3. Soru
Aşağıdakilerden hangisi veri bağlamanın avantajlarından biri DEĞİLDİR?
- Kod daha kısa, okunması ve bakımı daha kolay.
- Veriler ve görünümler açıkça birbirinden ayrılır.
- Android sistemi, her görünümü elde etmek için görüntüleme hiyerarşisinde yalnızca bir kez hareket eder.
findViewById()
çağrıldığında derleyici hatası oluşturulur.- Görünümlere erişmek için yazı güvenliği.
4. Soru
<layout>
etiketinin işlevi nedir?
- İçeriği düzendeki kök görünümünüzün etrafına sarmalarsınız.
- Bağlamalar, bir düzendeki tüm görünümler için oluşturulur.
- Üst düzey görünümü, veri bağlama kullanan bir XML düzeninde belirtir.
- Değişkeni bir veri sınıfına bağlamak için
<layout>
içindeki<data>
etiketini kullanabilirsiniz.
5. Soru
XML düzeninde bağlı verilere referans vermenin doğru yolu hangisidir?
android:text="@={myDataClass.property}"
android:text="@={myDataClass}"
android:text="@={myDataClass.property.toString()}"
android:text="@={myDataClass.bound_data.property}"
Sonraki dersi başlatma:
Bu kurstaki diğer codelab'lerin bağlantılarına ulaşmak için Android Kotlin Fundamentals codelabs açılış sayfasına göz atın.