1 00:00:00,920 --> 00:00:03,410 JustJava uygulamasına geri dönelim. 2 00:00:03,410 --> 00:00:07,260 MainActivity sınıfı içeresindeki DisplayMessage metotuna bir göz atalım. 3 00:00:07,260 --> 00:00:09,950 Her şey daha anlaşılır bir hal almaya başlıyor artık. 4 00:00:09,950 --> 00:00:14,350 Zaten orderSummaryTextView adında bir değişken oluşturduğumuzu biliyoruz. 5 00:00:14,350 --> 00:00:16,760 Bu görünümün veri türü de TextView'di. 6 00:00:17,790 --> 00:00:19,610 Bu kısmı henüz anlayamadık ama. 7 00:00:20,740 --> 00:00:23,290 Bir sonraki satırda, bu TextView öğesine bir metot çağırıyoruz. 8 00:00:24,650 --> 00:00:28,070 Yukarıda belirtilen aynı değişkeni kullanıyoruz. 9 00:00:28,070 --> 00:00:31,830 Yani, orderSummaryTextView.setText'i çağırıyoruz. 10 00:00:31,830 --> 00:00:34,290 Daha sonra da metot için giriş olarak bir string gireceğiz. 11 00:00:35,300 --> 00:00:38,790 Bu string mesajı, aslen görüntüleme mesajı metotuna 12 00:00:38,790 --> 00:00:40,200 bir giriş parametresi olarak geldi. 13 00:00:41,720 --> 00:00:45,250 Şimdi de kodun henüz anlamadığımız bu kısmını irdeleyelim. 14 00:00:45,250 --> 00:00:48,210 Görünüşe göre FindViewById bir metot çağrısı. 15 00:00:48,210 --> 00:00:53,530 Çünkü bu parantezler arasındaki giriş parametresi gibi gözüken kısmın önünde. 16 00:00:53,530 --> 00:00:57,458 Fakat ilginç olan, bu metotun sınıfın hiçbir yerinde tanımlanmamış olması. 17 00:00:57,458 --> 00:01:02,355 Bu isme iki kere tıklayıp Command+F tuşlarına basarsam veya 18 00:01:02,355 --> 00:01:07,560 Windows üzerinde iseniz Ctrl+F, o zaman bu dosya içinde arama yapabilirim. 19 00:01:07,560 --> 00:01:10,780 findViewById olan sadece iki sonuç görüyorum ve 20 00:01:10,780 --> 00:01:12,790 ikisi de benzer şekillerde kullanılmış. 21 00:01:12,790 --> 00:01:15,160 Fakat findViewById'i çağıran başka bir metot görmüyorum. 22 00:01:16,190 --> 00:01:19,640 Hazır lafı açılmışken, dana önceden MainActivity sınıfında 23 00:01:19,640 --> 00:01:23,450 setContentView'e bir çağrı görmüştük, fakat bu dosya içinde 24 00:01:23,450 --> 00:01:26,280 arama yaparsanız, o da MainActivity'de tanımlanmamış. 25 00:01:27,820 --> 00:01:29,620 Peki, bu yöntemler nerede tanımlanmış? 26 00:01:30,620 --> 00:01:33,610 MainActivity aslında oldukça kısa bir dosya. 27 00:01:33,610 --> 00:01:35,150 Sadece 90 satır uzunluğunda, 28 00:01:35,150 --> 00:01:38,790 ama bu sınıfta göründüğünden fazlası var. 29 00:01:38,790 --> 00:01:42,200 Kodda extends AppCompatActivity yazıyor. 30 00:01:42,200 --> 00:01:45,710 Bu da MainActivity'nin AppCompatActivity sınıfındaki 31 00:01:45,710 --> 00:01:49,290 bir işlevselliğin uzantısı olduğu anlamına geliyor. 32 00:01:49,290 --> 00:01:52,790 Bilgisayarınızda bir işlem çubuğu hareketi görürseniz, önemli değil, 33 00:01:52,790 --> 00:01:55,450 sadece bunun eski bir sürümü olduğu içindir. 34 00:01:55,450 --> 00:01:58,770 Kullanmanız gereken en son sürüm ise AppCompatActivity. 35 00:01:58,770 --> 00:02:02,420 Ayrıca AppCompatActivity, eski Android cihazlarda bize geriye dönük 36 00:02:02,420 --> 00:02:04,460 uyumluluk desteği de veriyor. 37 00:02:04,460 --> 00:02:07,980 AppCompatActivity, Android destek kütüphanesinin bir parçası. 38 00:02:07,980 --> 00:02:11,740 Hala eski Android cihazlar üzerinde çalışırken Android üzerindeki en son 39 00:02:11,740 --> 00:02:15,420 kullanıcı arabirimini kullanmamıza olanak sağlıyor. 40 00:02:15,420 --> 00:02:17,940 AppCompatActivity sınıfını genişleterek, 41 00:02:17,940 --> 00:02:20,620 bedavaya MainActivity içinden bütün işlevselliğe, 42 00:02:20,620 --> 00:02:24,490 bütün durum ve metotlara ulaşabiliyoruz. 43 00:02:24,490 --> 00:02:26,980 Buradan herhangi bir kodu kopyalayıp yapıştırmamıza gerek yok. 44 00:02:26,980 --> 00:02:28,800 Sadece sınıfı genişletmemiz yeterli. 45 00:02:30,090 --> 00:02:31,020 Eğer ilgileniyorsanız, 46 00:02:31,020 --> 00:02:35,880 AppCompatActivity'i Google'da arayarak daha fazla bilgiye ulaşabilirsiniz. 47 00:02:35,880 --> 00:02:39,700 İşte AppCompatActivity sınıfı için bir referans belgesi. 48 00:02:39,700 --> 00:02:41,920 Chrome uzantısı bende yüklü olduğundan 49 00:02:41,920 --> 00:02:43,120 kaynağı da görebiliyorum. 50 00:02:43,120 --> 00:02:47,890 Ve bu da AppCompatActivity sınıfının tanımlandığı yer. 51 00:02:47,890 --> 00:02:50,360 Burada bir çok işlevsellik olduğunu görebilirsiniz, fakat 52 00:02:50,360 --> 00:02:54,510 kilit mesaj, nasıl uygulandığını anlamak zorunda değilsiniz. 53 00:02:54,510 --> 00:02:58,350 Tek bilmeniz gereken, AppCompatActivity'i genişlettiğinizde 54 00:02:58,350 --> 00:03:01,010 bütün bu işlevselliklere bedavaya sahip olacak olmanız. 55 00:03:01,010 --> 00:03:03,580 Yüksek seviyede şu şekilde görselleştirebilirsiniz. 56 00:03:03,580 --> 00:03:05,900 Bu, MainActivity için bir sınıf tanımı. 57 00:03:05,900 --> 00:03:08,000 Ve diyelim ki, burada tanımlanmış bazı metotlarınız var. 58 00:03:08,000 --> 00:03:12,350 AppCompatActivity'i genişlettiğiniz zaman, AppCompatActivity'den 59 00:03:12,350 --> 00:03:14,200 durum ve metotlara ulaşabilirsiniz. 60 00:03:14,200 --> 00:03:17,870 MainActivity sınıfına fiziksel olarak eklenmiş değiller tabii ki, fakat 61 00:03:17,870 --> 00:03:19,280 orada olduklarını düşünebilirsiniz, 62 00:03:19,280 --> 00:03:22,930 çünkü hala duruma ve metotlara gönderim yapabilirsiniz. 63 00:03:22,930 --> 00:03:26,540 İşte kodumuz da setContentView veya findViewById tarzı şeylere böyle 64 00:03:26,540 --> 00:03:27,840 gönderim yapabiliyor. 65 00:03:27,840 --> 00:03:32,240 O metotları devraldığımız için MainActivity içinde tanımlamadık. 66 00:03:32,240 --> 00:03:35,110 MainActivity cihaz üzerinde bir ekran olarak gösteriliyor, fakat 67 00:03:35,110 --> 00:03:39,520 MainActivity için o kodu biz yazmadık, devraldık. 68 00:03:39,520 --> 00:03:42,750 Durum ve metotlara direkt sınıf içindeki AppCompatActivity'den sahip değiliz, 69 00:03:42,750 --> 00:03:46,840 fakat artık orada olduklarını ve onlara gönderim yapabileceğimizi biliyoruz. 70 00:03:46,840 --> 00:03:50,260 Devralmaktan konu açılmışken, bunun hem iyi hem de kötü yanları var. 71 00:03:50,260 --> 00:03:52,540 Bazen bir davranışı devralmak isteriz fakat 72 00:03:52,540 --> 00:03:54,980 diğer zamanlarda biraz da olsa değiştirmek isteyebiliriz. 73 00:03:55,980 --> 00:03:59,900 Bu devralınmış sınıftan bazı davranışları değiştirmek isterseniz 74 00:03:59,900 --> 00:04:02,230 belirli metotları geçersiz kılabilirsiniz. 75 00:04:02,230 --> 00:04:07,360 Bu @override metnini metotun üzerine ekleyebilirsiniz, böylece bilgisayar 76 00:04:07,360 --> 00:04:12,100 AppCompatActivity'nin o sürümünü istemediğinizi 77 00:04:12,100 --> 00:04:15,830 fakat onun yerine buradaki tanımladığınız sürümü istediğinizi bilecektir. 78 00:04:15,830 --> 00:04:18,620 Bu zor bir konu ve çok fazla pratik gerektiriyor. 79 00:04:18,620 --> 00:04:21,660 Fakat AppCompatActivity sınıfından bir metotu 80 00:04:21,660 --> 00:04:23,640 geçersiz kılmayla ilgili bir örnek gördük. 81 00:04:23,640 --> 00:04:26,380 Ve bu metot da onCreate metotu. 82 00:04:26,380 --> 00:04:31,170 MainActivity içindeki onCreate metotunu geçersiz kılarak, o metotu çağırdığımızda 83 00:04:31,170 --> 00:04:35,380 ne yapılması gerektiğini söyleyen kendi uyarlamamızı tanımlamış oluyoruz. 84 00:04:35,380 --> 00:04:37,180 Bu kısmı tam anlayamadıysanız endişelenmeyin. 85 00:04:37,180 --> 00:04:40,534 Size sadece, bir kaç tane nesne yönelimli programlama kavramlarıyla ilgili 86 00:04:40,534 --> 00:04:42,350 özet bilgiler veriyorum. 87 00:04:42,350 --> 00:04:46,160 Aklınızda hala cevap bekleyen sorular olması oldukça normal. 88 00:04:46,160 --> 00:04:49,370 Ve hala bu konuları tamamen anlamak için daha fazla 89 00:04:49,370 --> 00:04:50,860 okumanız gerektiği. 90 00:04:50,860 --> 00:04:53,771 MainActivity ile AppCompatActivity sınıfları arasındaki ilişkiyi 91 00:04:53,771 --> 00:04:58,220 görselleştirmenin bir diğer yolu da sınıf hiyerarşi şeması çizmek. 92 00:04:58,220 --> 00:05:00,930 Bu, görünüm hiyerarşi şeması çizmekten farklı, çünkü 93 00:05:00,930 --> 00:05:05,340 görünüm hiyerarşi şeması ekranda görüntülenen görünümleri gösterir. 94 00:05:05,340 --> 00:05:07,810 Sınıf hiyerarşi şeması ise farklı Java sınıfları 95 00:05:07,810 --> 00:05:09,990 arasındaki ilişkiyi gösterir. 96 00:05:09,990 --> 00:05:12,860 Üst sınıf olarak elimizde AppCompatActivity var. 97 00:05:12,860 --> 00:05:15,868 MainActivity, AppCompatActivity'den genişlediği için 98 00:05:15,868 --> 00:05:18,560 alt sınıf olarak tanımlanıyor. 99 00:05:18,560 --> 00:05:22,200 Bu sınıf tanımını ne zaman görürseniz, genişlettiğiniz her ne ise o 100 00:05:22,200 --> 00:05:23,970 üst sınıf olarak tanımlanır. 101 00:05:23,970 --> 00:05:25,770 Bu da alt sınıf olacaktır. 102 00:05:25,770 --> 00:05:29,070 Yani, DetailActivity adında başka bir etkinlik oluşturursanız ve 103 00:05:29,070 --> 00:05:32,340 AppCompatActivity'i genişletmişseniz, bu alt sınıf olur 104 00:05:32,340 --> 00:05:33,409 ve bu da üst sınıf. 105 00:05:34,720 --> 00:05:37,840 Java sınıf devralmasıyla ilgili işte bir örnek daha. 106 00:05:37,840 --> 00:05:40,520 Şöyle bir düşündüğünüzde, TextView, ImageView 107 00:05:40,520 --> 00:05:44,460 ve ButtonView'in hepsinin ortak yanları var. 108 00:05:44,460 --> 00:05:48,070 Bütün bu görünümlerin ekranda bir eni ve boyu mevcut. 109 00:05:48,070 --> 00:05:51,330 Bu kısmı henüz öğrenmedik ancak bir de görünebilirlik durumları var. 110 00:05:51,330 --> 00:05:54,400 Yani hepsi görünmez veya görünür hale getirilebilir. 111 00:05:54,400 --> 00:05:58,650 Hepsi için ortak olan başka özellikleri de var. 112 00:05:58,650 --> 00:06:02,370 TextView sınıfı içinde bunlar için kod yazıp ImageView ve 113 00:06:02,370 --> 00:06:05,590 Button sınıfı üzerine kopyalamak yerine 114 00:06:05,590 --> 00:06:07,610 daha zekice bir şey yapabiliriz. 115 00:06:07,610 --> 00:06:09,980 Bir View (görünüm) sınıfı oluşturabiliriz. 116 00:06:09,980 --> 00:06:14,110 Bu üç görünüm için ortak olan özellikleri çıkartabiliriz ve sonra da bu View 117 00:06:14,110 --> 00:06:19,730 sınıfının içine yerleştirebiliriz, böylece kodu bir kez yazmamız yeterli olacaktır. 118 00:06:19,730 --> 00:06:22,610 Fakat, sonra TextView sınıfı ile View sınıfı arasında nasıl 119 00:06:22,610 --> 00:06:24,000 bağ kuracağız? 120 00:06:24,000 --> 00:06:26,548 Eğer devralmayı düşünüyorsanız, doğru bildiniz. 121 00:06:26,548 --> 00:06:30,080 TextView java dosyasında TextView sınıfını tanımlayacağız. 122 00:06:30,080 --> 00:06:33,240 Bu sayede bütün bu verileri ve metotları View sınıfından alabileceğiz. 123 00:06:34,270 --> 00:06:37,520 Sonra TextView sınıfında bu kadar çok kod olmasına gerek kalmayacak, 124 00:06:37,520 --> 00:06:41,860 çünkü işlevselliğin bir kısmı zaten View sınıfında yazılı durumda. 125 00:06:41,860 --> 00:06:43,730 Aynı şey ImageView ve Button sınıfları için de geçerli, 126 00:06:43,730 --> 00:06:46,800 bu kadar kod yazmak zorunda değiliz. 127 00:06:46,800 --> 00:06:49,690 Bu dosyalarda, sadece View sınıfı ile ImageView 128 00:06:49,690 --> 00:06:53,090 arasındaki farklı olan şeyleri yazmamız yeterli. 129 00:06:53,090 --> 00:06:57,720 Ben bunu bir aralık belirleme olarak görüyorum. Yani ImageView sınıfı, 130 00:06:57,720 --> 00:07:01,890 View sınıfı ile karşılaştırıldığında, sadece farklı olan şeyleri tanımlamalı. 131 00:07:03,840 --> 00:07:06,960 Eğer ki View sınıfından bazı belli davranışları devralmak istemiyorsak, 132 00:07:06,960 --> 00:07:11,760 ImageView sınıfındaki ya da diğer sınıflardaki güncellenmiş davranışları 133 00:07:11,760 --> 00:07:12,820 belirtebiliriz. 134 00:07:14,070 --> 00:07:16,680 Bu noktada, terminolojiyi size hatırlatmak adına; 135 00:07:16,680 --> 00:07:20,039 TextView alt sınıf oluyor ve View de üst sınıf. 136 00:07:21,430 --> 00:07:23,980 Tekrardan, TextView sınıfı için belgelendirmeye döndüğümüzde 137 00:07:23,980 --> 00:07:27,310 artık bu kısmı anlayabilecek durumdayız. 138 00:07:27,310 --> 00:07:30,000 TextView için View'i genişlettiği yazıyor. 139 00:07:30,000 --> 00:07:33,330 Bunun, View sınıfından metot ve durum devraldığımız 140 00:07:33,330 --> 00:07:35,280 anlamına geldiğini artık biliyoruz. 141 00:07:35,280 --> 00:07:38,330 Ve burada da sınıf hiyerarşi şeması var. 142 00:07:38,330 --> 00:07:41,884 TextView sınıfının View sınıfından devraldığını gösteriyor. 143 00:07:43,730 --> 00:07:46,530 Ve sırayla, View sınıfı Object sınıfından devralıyor. 144 00:07:47,650 --> 00:07:50,060 Biraz incelerseniz, aslında TextView'den genişleyen 145 00:07:50,060 --> 00:07:54,780 EditText sınıfı gibi diğer sınıfları bulabilirsiniz. 146 00:07:54,780 --> 00:07:57,570 Yani, davranışı TextView sınıfından alıyor ve 147 00:07:57,570 --> 00:08:00,120 ona belirli bir işlevsellik ekliyor. 148 00:08:01,290 --> 00:08:03,590 Böylece EditText, TextView'den genişlemiş oluyor. 149 00:08:03,590 --> 00:08:06,720 Ve TextView de View'den genişliyor, ve View de Object'den genişliyor. 150 00:08:06,720 --> 00:08:09,830 İşte sınıf hiyerarşisi şeması da bu. 151 00:08:11,370 --> 00:08:13,950 Bir sürü şey var ve saatlerce buna bakabilirsiniz. 152 00:08:13,950 --> 00:08:17,010 Fakat ben size TextView belgelendirme sayfasında tek bir şey göstereceğim. 153 00:08:17,010 --> 00:08:20,820 SetVisibility için metotu göstermek istiyorum. 154 00:08:20,820 --> 00:08:24,350 İşte TextView sınıfı içinde SetVisibility için Java metotu bu. 155 00:08:24,350 --> 00:08:26,860 Görünümün görünebilir olup olmayacağını belirliyor. 156 00:08:28,000 --> 00:08:33,240 Eğer bu metota tıklarsam, beni View sınıfına götürür. 157 00:08:33,240 --> 00:08:36,010 Ve sonra da metotun ne işe yaradığını açıklıyor. 158 00:08:36,010 --> 00:08:39,860 Bu sayede bir TextView nesnesinin görünebilirlik metotunun olduğunu, 159 00:08:39,860 --> 00:08:43,659 fakat aslında View sınıfından devraldığını görebilirsiniz. 160 00:08:43,659 --> 00:08:47,470 Yani, bu işlevselliği View sınıfından bedavaya almışız. 161 00:08:47,470 --> 00:08:50,930 Pekala, bir ton yeni kavramı ele aldık. 162 00:08:50,930 --> 00:08:56,040 Normalde bu, bilgisayar bilimi kursunda bir döneme yayılır. 163 00:08:56,040 --> 00:08:58,260 Şimdi biraz alıştırma yapacağız ve 164 00:08:58,260 --> 00:09:01,170 umuyorum ki sizin için aradaki boşlukları doldurur. 165 00:09:01,170 --> 00:09:03,010 Fakat unutmayın ki, bu kavramları tamamen anlamanız çok daha 166 00:09:03,010 --> 00:09:06,610 fazla zamanınızı alacak ve daha çok pratik yapmanız gerekecek. 167 00:09:06,610 --> 00:09:09,700 Peki, ilk alıştırma; yeni bir Android uygulaması geliştirmenizi istiyorum, 168 00:09:09,700 --> 00:09:11,530 çünkü Just Java uygulamasını bozmak istemeyiz. 169 00:09:13,070 --> 00:09:14,640 Projeyi oluşturduktan sonra, uygulamayı çalıştırın. 170 00:09:15,790 --> 00:09:18,630 Uygulamanızı geliştirdiğiniz de, bir MainActivity dosyası göreceksiniz. 171 00:09:18,630 --> 00:09:22,530 Bu MainActivity dosyası AppCompatActivity'den genişleyecek. 172 00:09:22,530 --> 00:09:26,060 Bunun yerine, Android Studio'su sürümünüzde eğer MainActivity, 173 00:09:26,060 --> 00:09:28,760 ActionBarActivity'den genişliyorsa, o da olur. 174 00:09:28,760 --> 00:09:32,200 Zaten AppCompatActivity'nin sadece eski bir sürümü. 175 00:09:32,200 --> 00:09:35,650 Bu geçersiz kılma metotunu kaldırarak, onCreate metotunun 176 00:09:35,650 --> 00:09:40,280 AppCompatActivity'de göründüğü haline dönmüş olacağız. 177 00:09:40,280 --> 00:09:44,540 Bu metotun olması MainActivity'de onCreate için farklı bir davranış istediğimiz 178 00:09:44,540 --> 00:09:46,230 anlamına geliyor. 179 00:09:46,230 --> 00:09:49,540 Yani, onu kaldırmak bizi AppCompatActivity sınıfındaki 180 00:09:49,540 --> 00:09:52,040 orijinal davranışa geri döndürecek. 181 00:09:52,040 --> 00:09:53,380 Uygulamayı çalıştırdığınızda, 182 00:09:53,380 --> 00:09:57,250 ilk seferki çalıştırmanızdan farklı bir şeyler fark ettiniz mi? 183 00:09:57,250 --> 00:09:58,510 Cevabınızı bu metin kutusuna yazın.