JustJava uygulamasına geri dönelim.
MainActivity sınıfı içeresindeki
DisplayMessage metotuna bir göz atalım.
Her şey daha anlaşılır bir hal
almaya başlıyor artık.
Zaten orderSummaryTextView adında bir
değişken oluşturduğumuzu biliyoruz.
Bu görünümün veri
türü de TextView'di.
Bu kısmı henüz anlayamadık ama.
Bir sonraki satırda, bu TextView
öğesine bir metot çağırıyoruz.
Yukarıda belirtilen aynı
değişkeni kullanıyoruz.
Yani, orderSummaryTextView.setText'i
çağırıyoruz.
Daha sonra da metot için giriş
olarak bir string gireceğiz.
Bu string mesajı, aslen
görüntüleme mesajı metotuna
bir giriş parametresi olarak geldi.
Şimdi de kodun henüz
anlamadığımız bu kısmını irdeleyelim.
Görünüşe göre FindViewById
bir metot çağrısı.
Çünkü bu parantezler arasındaki giriş
parametresi gibi gözüken kısmın önünde.
Fakat ilginç olan, bu metotun sınıfın
hiçbir yerinde tanımlanmamış olması.
Bu isme iki kere tıklayıp Command+F
tuşlarına basarsam veya
Windows üzerinde iseniz Ctrl+F, o zaman
bu dosya içinde arama yapabilirim.
findViewById olan sadece
iki sonuç görüyorum ve
ikisi de benzer
şekillerde kullanılmış.
Fakat findViewById'i çağıran
başka bir metot görmüyorum.
Hazır lafı açılmışken, dana önceden
MainActivity sınıfında
setContentView'e bir çağrı görmüştük,
fakat bu dosya içinde
arama yaparsanız, o da
MainActivity'de tanımlanmamış.
Peki, bu yöntemler
nerede tanımlanmış?
MainActivity aslında
oldukça kısa bir dosya.
Sadece 90 satır uzunluğunda,
ama bu sınıfta
göründüğünden fazlası var.
Kodda extends AppCompatActivity yazıyor.
Bu da MainActivity'nin
AppCompatActivity sınıfındaki
bir işlevselliğin uzantısı
olduğu anlamına geliyor.
Bilgisayarınızda bir işlem çubuğu
hareketi görürseniz, önemli değil,
sadece bunun eski bir
sürümü olduğu içindir.
Kullanmanız gereken en son
sürüm ise AppCompatActivity.
Ayrıca AppCompatActivity, eski
Android cihazlarda bize geriye dönük
uyumluluk desteği de veriyor.
AppCompatActivity, Android
destek kütüphanesinin bir parçası.
Hala eski Android cihazlar üzerinde
çalışırken Android üzerindeki en son
kullanıcı arabirimini
kullanmamıza olanak sağlıyor.
AppCompatActivity
sınıfını genişleterek,
bedavaya MainActivity
içinden bütün işlevselliğe,
bütün durum
ve metotlara ulaşabiliyoruz.
Buradan herhangi bir kodu
kopyalayıp yapıştırmamıza gerek yok.
Sadece sınıfı genişletmemiz yeterli.
Eğer ilgileniyorsanız,
AppCompatActivity'i Google'da arayarak
daha fazla bilgiye ulaşabilirsiniz.
İşte AppCompatActivity sınıfı
için bir referans belgesi.
Chrome uzantısı bende yüklü olduğundan
kaynağı da görebiliyorum.
Ve bu da AppCompatActivity
sınıfının tanımlandığı yer.
Burada bir çok işlevsellik
olduğunu görebilirsiniz, fakat
kilit mesaj, nasıl uygulandığını
anlamak zorunda değilsiniz.
Tek bilmeniz gereken,
AppCompatActivity'i genişlettiğinizde
bütün bu işlevselliklere
bedavaya sahip olacak olmanız.
Yüksek seviyede şu
şekilde görselleştirebilirsiniz.
Bu, MainActivity için bir sınıf tanımı.
Ve diyelim ki, burada
tanımlanmış bazı metotlarınız var.
AppCompatActivity'i genişlettiğiniz
zaman, AppCompatActivity'den
durum ve metotlara ulaşabilirsiniz.
MainActivity sınıfına fiziksel
olarak eklenmiş değiller tabii ki, fakat
orada olduklarını düşünebilirsiniz,
çünkü hala duruma ve
metotlara gönderim yapabilirsiniz.
İşte kodumuz da setContentView veya
findViewById tarzı şeylere böyle
gönderim yapabiliyor.
O metotları devraldığımız için
MainActivity içinde tanımlamadık.
MainActivity cihaz üzerinde bir ekran
olarak gösteriliyor, fakat
MainActivity için o kodu
biz yazmadık, devraldık.
Durum ve metotlara direkt sınıf içindeki
AppCompatActivity'den sahip değiliz,
fakat artık orada olduklarını ve onlara
gönderim yapabileceğimizi biliyoruz.
Devralmaktan konu açılmışken, bunun
hem iyi hem de kötü yanları var.
Bazen bir davranışı
devralmak isteriz fakat
diğer zamanlarda biraz da
olsa değiştirmek isteyebiliriz.
Bu devralınmış sınıftan bazı
davranışları değiştirmek isterseniz
belirli metotları
geçersiz kılabilirsiniz.
Bu @override metnini metotun üzerine
ekleyebilirsiniz, böylece bilgisayar
AppCompatActivity'nin o sürümünü
istemediğinizi
fakat onun yerine buradaki tanımladığınız
sürümü istediğinizi bilecektir.
Bu zor bir konu ve çok
fazla pratik gerektiriyor.
Fakat AppCompatActivity
sınıfından bir metotu
geçersiz kılmayla ilgili
bir örnek gördük.
Ve bu metot da onCreate metotu.
MainActivity içindeki onCreate metotunu
geçersiz kılarak, o metotu çağırdığımızda
ne yapılması gerektiğini söyleyen kendi
uyarlamamızı tanımlamış oluyoruz.
Bu kısmı tam anlayamadıysanız
endişelenmeyin.
Size sadece, bir kaç tane nesne yönelimli
programlama kavramlarıyla ilgili
özet bilgiler veriyorum.
Aklınızda hala cevap bekleyen
sorular olması oldukça normal.
Ve hala bu konuları tamamen
anlamak için daha fazla
okumanız gerektiği.
MainActivity ile AppCompatActivity
sınıfları arasındaki ilişkiyi
görselleştirmenin bir diğer yolu da
sınıf hiyerarşi şeması çizmek.
Bu, görünüm hiyerarşi şeması
çizmekten farklı, çünkü
görünüm hiyerarşi şeması ekranda
görüntülenen görünümleri gösterir.
Sınıf hiyerarşi şeması
ise farklı Java sınıfları
arasındaki ilişkiyi gösterir.
Üst sınıf olarak elimizde
AppCompatActivity var.
MainActivity, AppCompatActivity'den
genişlediği için
alt sınıf olarak tanımlanıyor.
Bu sınıf tanımını ne zaman görürseniz,
genişlettiğiniz her ne ise o
üst sınıf olarak tanımlanır.
Bu da alt sınıf olacaktır.
Yani, DetailActivity adında başka
bir etkinlik oluşturursanız ve
AppCompatActivity'i genişletmişseniz,
bu alt sınıf olur
ve bu da üst sınıf.
Java sınıf devralmasıyla
ilgili işte bir örnek daha.
Şöyle bir düşündüğünüzde,
TextView, ImageView
ve ButtonView'in hepsinin
ortak yanları var.
Bütün bu görünümlerin ekranda
bir eni ve boyu mevcut.
Bu kısmı henüz öğrenmedik ancak
bir de görünebilirlik durumları var.
Yani hepsi görünmez veya
görünür hale getirilebilir.
Hepsi için ortak olan
başka özellikleri de var.
TextView sınıfı içinde bunlar
için kod yazıp ImageView ve
Button sınıfı üzerine
kopyalamak yerine
daha zekice bir şey yapabiliriz.
Bir View (görünüm) sınıfı oluşturabiliriz.
Bu üç görünüm için ortak olan özellikleri
çıkartabiliriz ve sonra da bu View
sınıfının içine yerleştirebiliriz, böylece
kodu bir kez yazmamız yeterli olacaktır.
Fakat, sonra TextView sınıfı ile
View sınıfı arasında nasıl
bağ kuracağız?
Eğer devralmayı düşünüyorsanız,
doğru bildiniz.
TextView java dosyasında
TextView sınıfını tanımlayacağız.
Bu sayede bütün bu verileri ve metotları
View sınıfından alabileceğiz.
Sonra TextView sınıfında bu kadar
çok kod olmasına gerek kalmayacak,
çünkü işlevselliğin bir kısmı
zaten View sınıfında yazılı durumda.
Aynı şey ImageView ve
Button sınıfları için de geçerli,
bu kadar kod yazmak
zorunda değiliz.
Bu dosyalarda, sadece
View sınıfı ile ImageView
arasındaki farklı olan
şeyleri yazmamız yeterli.
Ben bunu bir aralık belirleme olarak
görüyorum. Yani ImageView sınıfı,
View sınıfı ile karşılaştırıldığında,
sadece farklı olan şeyleri tanımlamalı.
Eğer ki View sınıfından bazı belli
davranışları devralmak istemiyorsak,
ImageView sınıfındaki ya da diğer
sınıflardaki güncellenmiş davranışları
belirtebiliriz.
Bu noktada, terminolojiyi
size hatırlatmak adına;
TextView alt sınıf oluyor
ve View de üst sınıf.
Tekrardan, TextView sınıfı için
belgelendirmeye döndüğümüzde
artık bu kısmı
anlayabilecek durumdayız.
TextView için View'i
genişlettiği yazıyor.
Bunun, View sınıfından metot
ve durum devraldığımız
anlamına geldiğini artık biliyoruz.
Ve burada da sınıf
hiyerarşi şeması var.
TextView sınıfının View
sınıfından devraldığını gösteriyor.
Ve sırayla, View sınıfı
Object sınıfından devralıyor.
Biraz incelerseniz, aslında
TextView'den genişleyen
EditText sınıfı gibi diğer
sınıfları bulabilirsiniz.
Yani, davranışı TextView
sınıfından alıyor ve
ona belirli bir işlevsellik ekliyor.
Böylece EditText,
TextView'den genişlemiş oluyor.
Ve TextView de View'den genişliyor,
ve View de Object'den genişliyor.
İşte sınıf hiyerarşisi şeması da bu.
Bir sürü şey var ve
saatlerce buna bakabilirsiniz.
Fakat ben size TextView belgelendirme
sayfasında tek bir şey göstereceğim.
SetVisibility için metotu
göstermek istiyorum.
İşte TextView sınıfı içinde
SetVisibility için Java metotu bu.
Görünümün görünebilir
olup olmayacağını belirliyor.
Eğer bu metota tıklarsam,
beni View sınıfına götürür.
Ve sonra da metotun
ne işe yaradığını açıklıyor.
Bu sayede bir TextView nesnesinin
görünebilirlik metotunun olduğunu,
fakat aslında View sınıfından
devraldığını görebilirsiniz.
Yani, bu işlevselliği View
sınıfından bedavaya almışız.
Pekala, bir ton yeni
kavramı ele aldık.
Normalde bu, bilgisayar bilimi
kursunda bir döneme yayılır.
Şimdi biraz alıştırma yapacağız ve
umuyorum ki sizin için
aradaki boşlukları doldurur.
Fakat unutmayın ki, bu kavramları
tamamen anlamanız çok daha
fazla zamanınızı alacak ve daha çok
pratik yapmanız gerekecek.
Peki, ilk alıştırma; yeni bir Android
uygulaması geliştirmenizi istiyorum,
çünkü Just Java uygulamasını
bozmak istemeyiz.
Projeyi oluşturduktan sonra,
uygulamayı çalıştırın.
Uygulamanızı geliştirdiğiniz de,
bir MainActivity dosyası göreceksiniz.
Bu MainActivity dosyası
AppCompatActivity'den genişleyecek.
Bunun yerine, Android Studio'su
sürümünüzde eğer MainActivity,
ActionBarActivity'den
genişliyorsa, o da olur.
Zaten AppCompatActivity'nin
sadece eski bir sürümü.
Bu geçersiz kılma metotunu
kaldırarak, onCreate metotunun
AppCompatActivity'de göründüğü
haline dönmüş olacağız.
Bu metotun olması MainActivity'de onCreate
için farklı bir davranış istediğimiz
anlamına geliyor.
Yani, onu kaldırmak bizi
AppCompatActivity sınıfındaki
orijinal davranışa geri döndürecek.
Uygulamayı çalıştırdığınızda,
ilk seferki çalıştırmanızdan
farklı bir şeyler fark ettiniz mi?
Cevabınızı bu metin kutusuna yazın.