Android Studio ile Android Uygulama Geliştirme Eğitimi
Lars Vogel (c) 2009, 2016 vogella GmbH
sürüm 14.4,21.11.2016
İçindekiler
- 1. Android ile Uygulama Geliştirmeye Giriş
- 2. Android Studio Kurulumu
- 3. Alıştırma: Android Studio’nun Kullanılması
- 4. Android SDK Sürümlerinin Yönetilmesi
- 5. Test için Gerçek Android Cihaz Kullanımı
- 5.1. Android Emülatörü ve Android Sanal Cihazı
- 5.2. Hata Ayıklama Sertifikası (debug certificate) ve Geçerlilik Tarihi
- 5.3. Google ve Android AVD
- 5.4. GPU İşleme ile Hız Optimizasyonu
- 5.5. Intel Sistem Görüntüsü ile Hız Optimizasyonu
- 5.6. Intel Emülatörünün Windows’ta Kurulumu
- 5.7. Intel Emülatörünün Linux’ta Kurulumu
- 5.8. Test için Gerçek Android Cihazı Kullanımı
- 6. Android Uygulamasının Yazılımsal Bileşenleri
- 7. Android Manifest
- 8. Kaynaklar (Resources)
- 9. Görünümler (views) ve Yerleşim Yöneticisi (layout manager)
- 9.1. View – Android kullanıcı arayüzü bileşenleri (widgets)
- 9.2. Layout Manager’ın Kullanımı
- 9.3. Yerleşim (layout) Öznitelikleri
- 9.4. Sabit (Constraint) Yerleşim
- 9.5. Çerçeve (Frame) Yerleşim
- 9.6. Doğrusal (Linear) Yerleşim
- 9.7. Göreli (Relative) Yerleşim
- 9.8. Izgara (Grid) Yerleşim
- 9.9. Kaydırma Görünümü (ScrollView)
- 10. Alıştırma: Görünümlerle (view) İlk Etkileşiminiz
- 11. Alıştırma: Çalışma Zamanında, Yerleşim Görünümünün Etkisi
- 12. Statik Kaynaklara Erişim ve Kullanımı
- 13. Alıştırma: XML Dosyalarında ve Kaynak Kodda Kaynakların (resource) Kullanımı
- 14. Alıştırma: ScrollView Kullanımı
- 15. Alıştırma: Sıcaklık Dönüştürücü Uygulaması
- 16. Dağıtım
- 17. Bu Web Sitesi Hakkında
- 18. Çevrimiçi Android Kaynakları
- Ek A: Telif Hakkı ve Lisans
Bu makalede, Android Studio kullanarak nasıl, Android uygulamaları oluşturacağınız anlatılmaktadır. Anlatımın genelinde, son Android ve Android Studio sürümü kullanılmıştır.
1. Android ile Uygulama Geliştirmeye Giriş
1.1. Android İşletim Sistemi
Android temelde Linux çekirdeğini kullanan bir işletim sistemidir. Android sistemini geliştirmekten sorumlu olan proje, Android Açık Kaynak Kod Projesidir (AOSP) ve Google tarafından yürütülmektedir.
Aşağıdaki şemada gösterildiği gibi Android işletim sistemi dört bölüme ayrılabilir. Android ile uygulama geliştiren biri, bu katmanlardan en üstte bulunan iki tanesi kullanarak yeni Android uygulamaları yaratabilir.
Katmanlar bu şekilde tanımlanabilir:
- Uygulamalar (Applications) : Android Açık Kaynak Kod Projesi; Tarayıcı, Kamera, Galeri, Müzik, Telefon gibi birçok varsayılan uygulama içerir.
- Uygulama çatısı (Application Framework) : Android uygulamaları ile Android sistemi arasında yüksek seviyeli iletişim sağlayan api’dir.
- Kütüphaneler ve çalışma zamanı (Libraries ve Runtime) : Grafik, veri saklama, web tarayıcısı gibi temel çatı fonksiyonları için gerekli kütüphaneler. Aynı zamanda Android Runtime ve bununla birlikte Android uygulamaları için gerekli temel Java kütüphanelerini de içerir.
- Linux çekirdeği (Linux Kernel) : Bulunan donanım ile iletişim sağlayan katman.
Android’in yayınlanan farklı sürümlerini aşağıdaki tabloda bulabilirsiniz.
Kod adı | Sürüm | API seviyesi |
Nougat | N | 24 |
Marshmallow | 6.0 | 23 |
Lollipop | 5.1 | 22 |
Lollipop | 5.0 | 21 |
KitKat | 4.4 – 4.4.4 | 19 |
Jelly Bean | 4.1.x – 4.3.x | 16 – 18 |
Ice Cream Sandwich | 4.0.1 – 4.0.4 | 14 -15 |
Honeycomb | 3.2.x | 13 |
Honeycomb | 3.0 – 3.1 | 11 – 12 |
Gingerbread | 2.3 – 2.3.7 | 9-10 |
Froyo | 2.2.x | 8 |
Eclair | 2.1 | 7 |
Eclair | 2.0 – 2.0.1 | 5 -6 |
Donut | 1.6 | 4 |
Cupcake | 1.5 | 3 |
(Kod adı yok) | 1.1 | 2 |
(Kod adı yok) | 1.0 | 1 |
1.2. Android Uygulamaları Nasıl Geliştirilir
Android uygulamaları Java Programlama dili kullanılarak yazılır.
Geliştirme sürecinde programcı, Android için yapılandırma dosyaları oluşturur ve uygulama mantığını Java programlama dilinde yazar.
Android geliştirme araçları, bu uygulama dosyalarını Android uygulamasına dönüştürür. Programcı kurulumu başlatırsa, tüm Android uygulaması derlenir, paketlenir, dağıtım yapılır ve başlatılmaya hazır hale gelir.
Android Yazılım Geliştirme Kiti (Android SDK) ve Gradle aracı Android uygulamalarının derlenmesi ve paketlenmesi için gerekli işlemleri yapacak araçları içerir. Android ekibi, Android uygulamalarını yapılandırmak için Gradle eklentisini sağlamaktadır. Bu eklentinin kullanılabilir sürümlerine erişmek için aşağıdaki bağlantıyı kullanabilirsiniz. https://jcenter.bintray.com/com/android/tools/build/gradle/
Android SDK, Android debug bridge’i (Android’in hata ayıklama köprüsünü (adb)) içerir. Adb, cihazı yönetmek ya da uygulamanızda hata ayıklama yapmak amacıyla, sanal veya gerçek bir Android cihazına bağlanmanıza izin veren bir araçtır.
1.3. Android Geliştirme Araçları ve Android Studio
Android uygulamaları geliştirmek için, Google’ın desteklediği Android Studio isimli bir IDE bulunmaktadır. Bu IDE altyapı olarak IntelliJ IDE’sini kullanmaktadır.
Android araçları, Android tarafından kullanılan dosyalar için özelleştirilmiş düzenleyiciler sağlar. Android yapılandırma dosyalarının birçoğu XML temellidir. Bu durumda editör; XML dosyası görünümden, veri girişi yapabileceğiniz kullanıcı arayüzü görünümüne geçiş yapmanıza olanak sağlar.
Android ile uygulama geliştirmek için Eclipse kullanımı
Google geliştirme ekibi, artık Android Studio üzerine odanlanmıştır. Bu yazı kaleme alındığında Eclipse Gradle aracı Android uygulamaları tarafından desteklenmemektedir.
Bu durumun Eclipse tarafında düzeltilmesi için https://bugs.eclipse.org/bugs/show_bug.cgi?id=468315 bağlantısından kayıt olunuz.
Buna ek olarak Google’ın Eclipse desteğini sürdürmesi için onu ikna edebilirsiniz. Https://code.google.com/p/android/issues/detail?id=81451 bağlantısına giderek yıldız işaretini tıklayınız.
1.4. Kaynak Koddan Android Uygulamasına Geçiş Süreci
Bu bölüm, build işlemi ile ilgili arka plan bilgisidir. Android uygulamaları geliştirmeniz için gerekli değildir. Dilerseniz bu bölümü atlayabilirsiniz. |
Java derleyicisi tarafından, Java kaynak dosyaları, Java sınıf dosyalarına dönüştürülür. Android SDK’sı dx olarak isimlendirilen araç ile Java sınıf dosyalarını .dex (Dalvik Executable) dosyalarına dönüştürür. Uygulamaya ait tüm sınıf dosyaları bu .dex dosyalarında bulunur. Sınıf dosyalarının dönüştürülmesi sürecinde tekrarlanan bilgiler optimize edilerek .dex dosyalarında saklanır. Örneğin, farklı bir sınıf dosyasında aynı String
bulunursa .dex dosyası bunlardan sadece bir tane String
’in referansını saklayacaktır.
.dex dosyaları onlara karşılık gelen sınıf dosyalarına oranla oldukça küçük dosya büyüklüğüne sahiptirler.
.dex dosyası ve Android projesinde bulunan görsel ve XML dosyaları gibi kaynaklar paketlenerek .apk (Android Paket) dosyası oluşturulur. Bu paketleme işlemi aapt (Android Varlık Paketleme Aracı) programı tarafından yapılır.
.Apk dosyası Android uygulamasının çalışması için gerekli tüm veriyi içerir ve adb aracı ile bir Android cihazına yüklenebilir.
Android 5.0’dan itibaren tüm Android uygulamaları çalışma zamanında Android RunTime (ART) kullanmaktadır. ART Ahead Of Time (önceden) derleme kullanır. Uygulama Android cihaza kurulurken, uygulamanın kodu doğrudan makine koduna çevrilir. Bunun sonucunda %30 daha büyük bir derleme kodu elde edilir ancak, uygulama başlatılırken daha hızlı yürütülür.
Bu aynı zamanda daha az pil kullanımını sağlar çünkü derleme sadece bir kez, uygulama ilk kez çalıştırıldığında yapılır.
Dex2oat
, Android aracı tarafından oluşturulan .dex dosyasını alır ve bunu değiştirip derleyerek Yürütülebilir ve Bağlantılı Biçime (ELF dosyası) oluşturur. Bu dosya; dex kodu, derlenmiş makina kodu ve metadatayı içerir. .dex kodunu saklamanız, mevcut araçların hala çalışmasına olanak tanır.
ART’daki çöp toplama, uygulamanın donduğu zamanları azaltmak için optimize edilmiştir.
1.5. Google Play
Yazılım geliştiricilerin, geliştirdikleri uygulamaları Android kullanıcılarına sunmasını sağlamak için Google, Google Play isminde bir pazar yeri servisi sunmaktadır. Kullanıcılar herhangi bir uygulama indirmek ve yüklemek için, Google Play uygulaması aracılığı ile Google Play servisine erişebilirler.
Google Play uygulamların güncellenmesini de sağlamaktadır. Uygulama geliştirici var olan uygulamasının yeni bir sürümünü Google Play’e yüklerse, bu servis tüm kullanıcılara güncelleme olduğunu bildirir ve güncellemeyi kurmalarını sağlar.
Google Play, Android Uygulama geliştiricileri için de birçok servis ve kütüphaneye erişim sağlar. Örneğin, Google Haritaları kullanmak ve göstermek için gerekli servislere buradan ulaşabilirsiniz. Bu servislerin Google Play üzerinden dağıtılmasının avantajı daha eski Android sürümleri için de kullanılabilirlik sağlamasıdır. Telefonda bulunan Android sürümünü güncellemeden Google bu servisleri günceleyebilmektedir.
2. Android Studio Kurulumu
2.1. Sistem Gereklilikleri
Android uygulaması geliştirmek için bilgisayar performansınızın yüksek olması gerekmektedir. En verimli şekilde çalışabilmek için bilgisayarınızın, 2.6 GHz işlemcisi ve en az 8 GB belleği olmalıdır. SSD bellek Android emülatörünün çalışmasını kayda değer şekilde hızlandıracaktır.
2.2. Linux’ta Kullanmak İçin Gereklilikler
Android SDK’sı 32 bittir. Bu nedenle 64 bit Linux sistemlerinde kullanmak isterseniz ia32-libs
paketini yüklemeniz gerekmektedir. Bu işlemi Ubuntu’da yakmak için aşağıdaki komutu kullanabilirsiniz.
apt-get install ia32-libs
Farklı bir Linux dağıtımı kullanıyorsanız, lütfen bu dağıtımın dokümantasyonunu kontrol ediniz.
2.3. Android Studio’nun İndirilmesi
Aşağıdaki bağlantıdan Android Studio’yu indirebilirsiniz. http://developer.android.com/sdk/index.html
İki farklı indirme seçeneği ile karşılaşacaksınız. “Sadece SDK araçları” ve” Android Studio paketleri”.Bunlardan, sizin işletim sisteminiz için uygun olan Android Studio paketlerini indiriniz.
2.4. Android Studio Kurulumu
Windows için kurulum oldukça basit, sadece indirmiş olduğunuz .exe dosyasını çalıştırmanız yeterli. Mac OSX için, Android Studio’yu Uygulamalar klasörüne sürükleyiniz.
Linux için, indirmiş olduğunuz zip dosyasını uygulamalarınızın bulunduğu klasöre çıkartınız. Android Studio’yu çalıştırmak için, Terminalden android-studio/bin/ dizini altındaki studio.sh betiğini çalıştırınız.
Android Studio’yu ilk çalıştırdığınızda, isterseniz var olan Android kurulumunun ayarlarını aktarabilirsiniz.
Sonra kurulum adımlarını takip ediniz.
Son sayfaya ulaştığınızda Finish’e tıklayınız.
3. Alıştırma: Android Studio’nun Kullanılması
Bu alıştırmada bir Android projesi oluşturulacak ve Android sanal cihazında çalıştırılacak.
3.1. Yeni Android Projesi Oluşturma
Başlamak için, Start a new Android Studio project bağlantısına basınız. Eğer daha önce bir proje yarattıysanız, buna alternatif olarak, menüden File ▸ New Project… seçiniz.
Projeniz için aşağıdaki verileri kullanınız. Projenin yeri ve paket ismi yaptığınız girişler üzerinden üretilecektir. Eğer farklı bir paket ismi kullanmak isterseniz, Edit bağlantısına tıklayınız.
Özellik | Değer |
---|---|
Uygulama Adı | Test App (Deneme Uyg) |
Şirket Alan Adı | android.vogella.com |
Paket Adı | com.vogella.android.testapp |
API (En az, Hedef, Derleme) | Latest (En son) |
Şablon | Empty Activity (Boş Activity) |
Eğer daha indirilmemişse, Android Studio gerekli SDK’yı otomatik olarak indirir. Kurulum ayarlarınıza bağlı olarak bir sonraki pencere gösterilmeyebilir.
Bunun ardından Empty Activity şablonunu seçiniz.
En son sayfada, Geriye Dönük Uyumluluk (Backwards Compatibility) seçeneğinin işaretli olmadığından emin olunuz.
3.2. Üretilen Projenin İncelenmesi
Sihirbaz bir Android projesi oluşturacak. Üretilen projenin yapısını ve dosyalarını gözden geçirin.
Android Studio’da gösterilen görünüm ile gerçek dosya yapısı aynı değildir. Bu görünüm, uygulamanın mantıksal görünümü ifade eder. |
3.3. Sanal Cihaz Oluşturma (AVD)
Tools ▸ Android ▸ AVD Manager menüsünü kullanarak yeni bir Android Sanal Cihazı (AVD) tanımlayabilirsiniz. Açılan pencerede Create Virtual Device… düğmesine basınız.
Siz de aşağıdaki ekran görüntüsündeki değerleri seçiniz.
Bu ekranda AVD için, en son API seviyesini (API Level) seçiniz. Sekmelerden sisteminiz için ek imajlar (Images) seçebilirsiniz.
Son olarak Finish’e basınız. Bu işlem sonucunda bir AVD yapılandırması oluşturalacak ve bu kullanılabilir sanal cihazlar listesinde gösterilecektir.
3.4. Sanal Cihazın Çalıştırılması
Yeni eklemiş olduğunuz cihazı seçiniz ve Play düğmesine basınız
3.5. Sanal Cihazda Uygulamanın Başlatılması
Uygulamanızı başlatmak için Run ▸ Run ‘app’ seçiniz. Açılan pencerede uygulamanızın dağıtımını yapacağınız cihazı seçiniz.
Bir süre sonra uygulamanız, sanal cihaz üzerinde çalışacaktır.
4. Android SDK Sürümlerinin Yönetilmesi
4.1. Android SDK Yöneticisinin Kullanımı
Android SDK Yöneticisi, belirli Android sürümleri için Android paketlerini kurmanızı ya da silmenizi sağlar.
Android SDK Yöneticisini açmak için; Tools ▸ Android ▸ SDK Manager ya da araç çubuğunda bulunan SDK Manager ikonuna tıklayınız.
4.2. Seçilen Android Sürümünün ya da Kütüphanesinin Kurulumu
Android SDK Yöneticisinde gerekli Android sürümünü seçiniz ve Install düğmesine basınız. Aşağıdaki ekran görüntüsünde, Android’in API 18 sürümü seçilmiştir.
Kurulumu başlatmak için OK düğmesine basınız.
SDK Platforms sekmesi API sürümlerini kurmak için kullanılırken, SDK Tools sekmesi geliştirme araçlarını kurmak için kullanılır.
4.3. Destek Kütüphanesinin Kurulumu
Destekleme kütüphanesi, kullandığınız Android sürümünden daha düşük olan sürümleri kullanabilmeniz için geriye doğru uyumluluk sağlar. Android’den bağımsız olarak da bazı işlevsellikler sağlar. Örneğin; RecyclerView
görsel bileşeni etkin bir biçimde listeleme sağlar.
Şu an Android bu kütüphanenin v4, v7 ve v13 gibi birkaç sürümüne sahiptir. Bu sürümler, farklı Android API seviyeleri için geçerlidir. Örneğin; destekleme kütüphanesi v7, API seviyesi 7 olan Android cihazlarda çalışır. Destekleme kütüphanelerinin yüksek sürümleri daha düşük sürümlere de ihtiyaç duyar. Örneğin; v7 kütüphanesinin çalışabilmesi için v4 kütüphanesinin de olması gerekir.
5. Test için Gerçek Android Cihaz Kullanımı
5.1. Android Emülatörü ve Android Sanal Cihazı
Android araçları, Android cihaz emülatörünü de içerir. Bu emülatör bir Android Sanal Cihazı (AVD) çalıştırmak için kullanılabilir.
AVD Android uygulamalarınızı, seçilen Android sürümleri ve yapılandırması olan cihazlarda, gerçek cihazı kullanmadan test etmenizi sağlar. Sanal cihaz, seçtiğiniz Android sürümlerinde ve belirli yapılandıma ile uygulamanızı test etmenize imkan sağlar. Gerçek bir Android cihazınız olsa bile, AVD’lerin oluşturulması ve kullanılması konusunda bilgi sahibi olmalısınız.
Bir AVD yaratırken sanal cihazın yapılandırmasını tanımlayabilirsiniz. Bu yapılandırma ile çözünürlük, Android API sürümü ve dpi gibi özellikleri ayarlayabilirsiniz.
Farklı yapılandırmalara sahip birden fazla AVD tanımlayabilirsiniz ve bunları parelel olarak çalıştırabilirsiniz.
Eğer AVD başlatılırken durdurursanız, AVD bozulabilir. İlk başlatma uzun süre alabilir, örneğin eski makinelerde birkaç dakika sürebilir. Daha modern bilgisayarlarda bu işlem genel olarak 1 dakikadan kısa sürer. |
AVD başlar başlamaz, grafik arayüzünü fare ile kontrol edebilirsiniz. Emülatörün sağ tarafında bulunan menü aracılığıyla, telefon tuşlarını da kullanabilirsiniz.
AVD’yi çalıştırdıktan sonra geliştirme süresince kapatmayınız. Uygulamanızda herhangi bir değişiklik yaptığınızda bu sürümü test etmek isterseniz, uygulamanızı AVD’ye yeniden gönderebilirsiniz.
5.2. Hata Ayıklama Sertifikası (debug certificate) ve Geçerlilik Tarihi
Android uygulamaları, cihaza yüklenmeden önce imzalanmalıdır. Geliştirme aşamasında Android araçları uygulamayı debug key denilen, kendi oluşturduğu (self-signed) bir sertifika ile imzalar.
Bu Hata ayıklama sertifikası yaratıldığı günden itibaren 365 gün geçerlidir. Eğer sertifikanın süresi dolarsa, uygulamanızı build ederken “Sertikanızın süresi doldu” hata mesajını alırsınız.
Bu problemi çözmek için debug.keystore dosyasını siliniz. Varsayılan saklama konumu;
- ~/.android/ OS X ve Linux
- C:\Documents andSettings\[username]\.android\ Windows XP
- C:\Users\[username]]\.android\ Windows Vista ve Windows 7.
Debug anahtarı bulunamazsa ya da silinirse, bu Android araçları tarafından yeniden üretilir.
5.3. Google ve Android AVD
Android için bir AVD yarattığınızda Android Açık Kaynak Kod Projesin ‘deki programları içerir. Google API’leri için bir AVD yaratırsanız, bu Google’ın sağladığı ek kodları da içerir.
Google API için yaratılmış AVD’ler, Google Play hizmetlerini (Google haritalar API’si ve yeni konum servisleri gibi ) kullanan uygulamaları test etmeyi sağlar.
5.4. GPU İşleme ile Hız Optimizasyonu
Bir emülatör oluşturulurken Snapshot ya da Use Host GPU’nun etkin olup olmayacağını seçebilirsiniz.
İletişim kutusu, her iki seçeneği de seçebileceğinizi belirtir ancak bunu yaparsanız, bu seçeneklerin birlikte seçilemeyeceğini belirten bir hata mesajı alırsınız. |
Eğer Snapshot’ı seçerseniz, cihazı tekrar başlattığınızda çok hızlı açılacaktır, çünkü cihaz kapatıldığında AVD bulunulan son durumu saklayacaktır. Eğer Use Host GPU’yu seçerseniz AVD, ana bilgisayarınızın grafik kartını doğrudan kullanır; bu da emülatörde kullanılan cihazdaki işlem hızını arttırır.
5.5. Intel Sistem Görüntüsü ile Hız Optimizasyonu
ARM işlemci mimarisine dayalı veya Intel CPI mimarisine dayalı bir görüntü ile bir AVD çalıştırabilirsiniz.
Intel sistem görüntüsünü kullanan bir Android sanal cihazının, ARM tabanlı sistem görüntüsüne göre Intel / AMD donanımı üzerinde çalıştırılması çok daha hızlıdır. Çünkü emülatör, ARM CPU talimatlarını Intel / AMD CPU talimatlarına çevirmek zorunda kalmaz.
Intel görüntüsü her API seviyesi için olmayabilir. |
5.6. Intel Emülatörünün Windows’ta Kurulumu
Window işletim sistemi için, ek olarak bazı sürücüler kurmanız gerekebilir.
İndirme işlemi tamamlandığında, Android’in kurulu olduğu dizinin altında extras/intel klasöründe gerekli sürücüleri bulacaksınız.
.exe dosyalarını çalıştırarak bu sürücüleri kurmanız gerekmektedir.
Intel emülatörü hızlandırmak için, Windows işletim sisteminde ek kurulumlar yapmanız gerekecek. Android aracılığı ile indirmiş olduğunuz sürücüler büyük bir farklılık yaratmayacaktır. |
İndirme işleminin ardından, Intel emülatörünü kullanan yeni bir AVD yaratabilirsiniz. Bu emülatör daha hızlı başlayacaktır ve Android uygulamanızın çalıştırılması daha hızlı olacaktır.
5.7. Intel Emülatörünün Linux’ta Kurulumu
Linux işletim sistemi daha karmaşık bir kurulum süreci gerektirmektedir. Kurulum hakkında detaylı bilgi için ( Intel emülatör kurulum rehberi) bağlantısına bakabilirsiniz. Burada aynı zamanda Windows’ta kurulum bilgilerine de ulaşabilirsiniz.
5.8. Test için Gerçek Android Cihazı Kullanımı
Gerçek Android cihazı kullanmak için, kullanacağınız cihazın ayarlarında USB Debugging’i açmalısınız. Bunun için cihazda, Settings ▸ Development Options seçiniz ve USB-Debugging seçeneğini etkin duruma getiriniz.
Bu işlem için cep telefonunuza bazı sürücüler kurmanız gerekecektir. Linux ve Mac OS buna gerek duymayacaktır ancak Windows’ta gerekli sürücüleri kurmanız gerekli olacaktır.
Android uygulamanızın desteklediği en düşük Android sürümü, cihazınınızda bulunan Android sürümüne uygun olmalıdır. |
Eğer bilgisayarınıza birden fazla cihaz bağlı ise, hangi cihazın kullanılacağını seçebilirsiniz. Eğer sadece bir cihaz bağlı ise, uygulama otomatik olarak bu cihaza gönderilir.
6. Android Uygulamasının Yazılımsal Bileşenleri
6.1. Android Uygulaması
Android uygulaması (kısaca: Android app) diğer Android uygulamaları tarafından bağımsız olarak kullanılabilen ve başlatılabilen, kurulabilir tek bir birimdir. Bir Android uygulaması, Android bileşenleri, Java kodu ve kaynak (resource) bölümlerinden oluşur. Android uygulama bileşenleri, Intent
nesnesinde belirtilen görev açıklaması temel alınarak diğer Android uygulamalarının bileşenlerine bağlanabilir.
Var olan Android bileşenleri ve açıklamaları aşağıdaki tabloda verilmiştir.
Bileşen | Açıklama |
---|---|
Application | Bir Android uygulaması, diğer Android bileşenlerinden önce yaratılan bir Application sınıfına sahiptir. Bu bileşen uygulama kapatılırken en son durdurulur. Dışsal olarak tanımlanmamışsa, Android bu nesneyi otomatik olarak yaratır. |
Activity | Activity sınıfı Android uygulamasının görsel öğelerini temsil eder. Bir Android uygulaması birden çok activity’ye sahip olabilir. Kullanıcının etkileşimi ve kullanıcı arayüzü için activity’ler views ve fragmentleri kullanırlar. |
Service | Service’ler kullanıcı arayüzü gerektirmeyen görevleri yerine getiren bileşenlerdir. Bu bileşen, diğer Android bileşenleri ile haberleşir. Örneğin, broadcast receiver bileşeni kullanıcıyı, bildirim (notification) kullanarak haberdar eder. |
Broadcast receiver (kısaca: receiver) | Kayıt edilen bir receiver nesnesi sistem mesajları ve Intent’leri dinleyebilir. Eğer belirli bir olay (event) oluşursa, Android sistemi receiver’i bilgilendirir. Örneğin, receiver’a Android sisteminin boot işlemini bitirmesi olayını eklerseniz, receiver bu durumdan haberdar olacaktır. Ya da telefonun durumunda bir değişiklik olması olayını eklerseniz bu durumda örneğin telefon çalarsa receiver bundan haberdar olacaktır. |
Content provider (kısaca: provider) | provider uygulama verileri için yapısal bir arayüz sağlar. Provider bir uygulamanın içindeki verilere erişilmesini sağlarken, diğer uygulamalarla da veri paylaşımına olanak sağlar. Android SQLite veri tabanına sahiptir ve content provider bunu sık sık kullanır. SQLite veritabanı verileri saklar ve bu verilere provider aracılığı ile erişilir. |
6.2. Fragment, View, Layout manager aracılığı ile kullanıcı arayüzleri tanımlama
Fragmentlar, activity’lerin içeriğini oluşturan bileşenlerdir. Fragmentler uygulama kodunu sarmalarlar ve bu sayede tekrardan kullanılabilirler ve farklı boyutlardaki cihazları desteklerler.
Aşağıdaki görselde activity’i görebilirsiniz. Daha küçük ekranlarda sadece bir fragment görüntülenir ve kullanıcının diğer fragment’a geçmesine izin verilir. Geniş ekranlarda her iki fragment da aynı anda gösterilir.
View’lar buton, metin alanları gibi kullanıcı arayüzü bileşenleridir. viewların özniteliklerini kullanarak, görünümlerini ve davranışlarını düzenleyebilirsiniz.
ViewGroup diğer viewların düzenlenmesinden sorumludur. Bu aynı zamanda layout manager olarak da bilinir.
Yerleşim düzenleyicilerin taban sınıfı android.view.ViewGroup
dır ve bu sınıf da view’ların taban sınıfı olan android.view.View
sınıfından türetilmiştir.
Daha karmaşık dizilimler yaratmak için yerleşim düzenleyiciler iç içe kullanılabilir.
6.3. Ana Ekran Bileşenleri
Ana ekran görsel bileşenleri (widget), esas olarak Android ana ekranında kullanılan interaktif bileşenler sağlayan yayın alıcılarıdır (broadcast receiver). Kullanıcıya verileri gösterirler ve kullanıcıdan gelen eylemleri gerçekleştirirler. Örneğin; bir görsel bileşen yeni gelen e-postaların özetini gösterir ve kullanıcı bunlardan herhangi birini seçtiğinde, bununla e-posta uygulamasını başlatabilir.
View’larla (aynı zamanda görsel bileşen de (widget) denir) karıştırmamak için bu metinde ana ekran bileşenleri terimini kullanacağız.
6.4. Context
android.content.Context
sınıf nesneleri Android sistemi ile cihazda çalışmakta olan uygulamaların haberleşmesini sağlar. Sistem ya da uygulama kaynaklarına ve servislere erişim imkanı sağlar. Örneğin; Context
sınıfı aracılığı ile geçerli cihazın ekran boyutunu kontrol edebilirsiniz.
Activity’ler ve service’ler Context
sınıfından türetilmiştir. Bu nedenle, Context
’e erişmek için doğrudan kullanılabilirler.
7. Android Manifest
7.1. Android Uygulamasının Yapılandırılması
Android uygulamasına ait bileşenler, ayarlar ve metadatalar AndroidManifest.xml dosyasında tanımlanır. Bu dosya aynı zamanda manifest dosyası ya da manifest olarak da bilinir.
Tüm aktiviteler (activity), servisler (service) ve içerik sağlayıcılar (content provider) gibi uygulama bileşenleri bu dosyada statik olarak bildirilmelidir. Yayın alıcı (broadcast receiver) statik olarak bu dosyada tanımlanabilirken, aynı zamanda dinamik olarak çalışma zamanında da tanımlanabilir. Bu dosya, uygulamanın yüklenmesi sırasında Android sistemi tarafından okunur. Android sistemi, bu yapılandırma dosyasını değerlendirir ve uygulamanın özelliklerini belirler.
Android uygulamalarının build edilmesi ve paketlenmesi için kullanılan Gradle build sistemi manifest dosyasında değişiklik yapabilir. Örneğin uygulama sürümü tipik olarak Gradle build dosyası tarafından sağlanır.
7.2. Android Manifest Örneği
Aşağıdaki örnekte basit bir Android manifest dosyası gösterilmektedir.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.rssreader"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name="RssApplication"
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="RssfeedActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DetailActivity"
android:label="Details" >
</activity>
<activity android:name="MyPreferenceActivity" >
</activity>
<service android:name="RssDownloadService" >
</service>
</application>
</manifest>
7.3. Sürüm ve Paket
Package
özniteliği, bu dosyada adı geçen Java nesnelerinin bulunduğu temel paketi tanımlar. Java nesneleri farklı bir pakette bulunuyorsa, paket adı tam olarak bildirilmelidir.
Google Play, her Android uygulamasının kendine ait bir paket ismi olmasını gerekli tutar. Paket adı olarak domain adınızın tersten yazılmış hali genel kullanılan bir yöntemdir. Bu uygulamanızın diğer Adroid uygulamaları çakışmasını engeller.
android:versionName
ve android:versionCode
uygulamanızın sürümünü belirtir. versionName
kullanıcının versiyon adı olarak ne göreceğidir ve herhangi bir metin olabilir.
versionCode
tam sayı olmalıdır. Android marketi versionCode
’u kullanarak varolan uygulamanın güncellenmesi gerekip gerekmediğine karar verir. Genel olarak ilk sürüm için “1” kullanılır ve yayınladığınız her bir yeni sürümde bu değeri birer arttırırsınız.
7.4. Uygulama ve Bileşenler
<Application>
bölümü uygulamanızın metadata’sını tanımlamanızı sağlar ve isterseniz bu bölümde doğrudan application sınıfı tanımlayabilirsiniz. Bu bölüm aynı zamanda diğer Android bileşenlerinin bildirimlerini de içerir.
<activity>
etiketi bir activity tanımlamak için kullanılır. name
özelliği sınıfı gösterir. Eğer tam olarak belirtilmemişse, “package” özniteliğinde tanımlanan pakete göre belirlenir.
Android manifest dosyasındaki intent filter bölümü, Android çalışma zamanına, bu etkinliğin uygulamanın olası bir giriş noktası olarak kaydedilmesi ve Android sisteminin başlatıcısında bulunması gerektiğini bildirir.
( android:name=”android.intent.action.MAIN” ` ) buradan başlatılacağını gösterir. The `category android:name=”android.intent.category.LAUNCHER”
parametresi Android sistemine activity’i başlatıcıya eklemesini söyler.
<@string/app_name>
değeri kaynak dosyalarında belirtilen uygulama adının değerini içerir. Kaynak(resource) kullanımı, farklı cihazlar ve uygulamaların farklı dillere çevrilebilmesi için Stringler, renkler, ikonlar gibi farklı kaynaklar eklemeyi kolaylaştırır.
<Activity>
etiketinde olduğu gibi service, receiver ve provider gibi Android bileşenlerini de aynı şekilde kullanabilirsiniz.
7.5. En Düşük ve Hedef SDK
Manifest dosyasındaki uses-sdk
bölümü minSdkVersion
ve targetSdkVersion
şeklinde uygulamanızın SDK sürümünü belirtmenizi sağlar.
Değer | Açıklama |
---|---|
minSdkVersion | Android uygulamanızın çalışabileceği en düşük sürümü tanımlar. Bu öznitelik uygulamanızın Play Store’da filtrelenmesi amacıyla kullanılır. Kullanıcının cihazı, bu öznitelikte belirtilen API seviyesinden düşükse, kullanıcı uygulamanızı kuramaz. |
targetSdkVersion | Test ve geliştirme yaptığınız sürümü belirtir. Android cihazdaki API sürümüne eşit değilse, Android sistemi yeni ya da eski sürümlere göre uyumluk için değişiklikler yapabilir. Son Android gelişmelerinden faydalanmak için bunun en güncel API sürümü olmasını sağlamak iyi bir yöntemdir. |
7.6. İzinler
Android manifest dosyası, uygulama için gerekli olan izinleri de içermelidir. Örneğin; uygulama internet bağlantısına ihtiyaç duyuyorsa, bu bölümde belirtilmelidir.
Uygulamanıza ait izinler <permission>
etiketi içerisinde bildirebilir ve gerekli olan izin <uses-permission>
etiketi altında bildirilir.
İnternet erişimi gibi belirli izinler, Android 6.0 ve üst sürümlerde otomatik olarak aktif edilir. Diğer izinlerin aktif edilebilmesi için kullanıcının bunları onaylaması gereklidir.
7.7. Gerekli Cihaz Yapılandırmaları
Manifest dosyasındaki uses-configuration
bölümü cihazın kullanacağı girdi (input) yöntemini belirleminizi sağlar. Örneğin; aşağıdaki bölümde belirtildiği gibi uygulamanız cihazın donanımsal klavyesine gereksinim duymaktadır.
<uses-configuration android:reqHardKeyboard="true"/>
uses-feature
bölümü cihazın gerekli donanımsal yapılandırmasını belirtmenizi sağlar. Örneğin; aşağıdaki bölümde belirtildiği gibi uygulamanız cihazın kamerasına gereksinim duymaktadır.
<uses-feature android:name="android.hardware.camera" />
7.8. Kurulum Yeri
installLocation
özelliği ile uygulamanızın harici depolama birimine kurulmasını sağlayabilirsiniz. auto
ya da preferExternal
seçeneklerini kullanabilirsiniz.
Gerçekte bu seçenek nadiren kullanılmaktadır, çünkü cihaz bir bilgisayara bağlandıktan ve USB depolama birimi olarak eklendikten sonra harici depolama biriminde kurulu bir uygulama durdurulur.
7.9. Daha fazla bilgi
Manifest doyasında bulunan bölümler ve özellikler hakkında daha fazla bilgiye http://developer.android.com/guide/topics/manifest/manifest-intro.html.bağlantısından ulaşabilirsiniz.
8. Kaynaklar (Resources)
8.1. Kaynak dosyaları
XML yapılandırma dosyaları ve görseller için Android statik kaynak oluşturma imkanı sağlar. Bu tasarım, kaynakları(resources), Android uygulamanızın kodundan ayırmanızı sağlar.
Kayanak dosyaları, uygulamanızda daha önce oluşturulmuş olan /res dizinin altında bulunmalıdır. Daha özelleştirilmiş alt dizinler, kullanacağınız kaynak türüne göre değişebilir. Özel bir yapılandırma için kullanılacak kaynak klasörlerinin isimlendirilmesinde ek niteleyiciler kullanabilirsiniz. Bunlara kaynak niteleyici (resource qualifiers) denir. Örneğin, layout dosyasının sadece belli ekran boyutunda geçerli olduğunu belirtebilirisiniz.
Aşağıdaki tabloda desteklenen kaynakları ve bunların klasör isimlendirilmesinde kullanılan standart ön eklerini bulabilirsiniz.
Kaynak | Klasör | Açıklama |
---|---|---|
Çizilebilir | /res/drawables | Görseller (png, jpeg dosyaları), vektörel çizimler ya da Android cihazın matlığını otomatik olarak ayarlayan XML dosyaları |
Basit Değerler | /res/values | Metin, renk, boyut, biçim ve string ya da tam sayılardan oluşan statik dizilerden oluşan XML dosyaları. Geleneksel olarak her tür ayrı dosya olarak saklanır. Örneğin, stringler res/values/strings.xml dosyasında tanımlanır. |
Layouts (Yerleşim) | /res/layout | Kullanıcı arayüzü tanımları için kullanılan activity’ler ve fragment’ları içeren yerleşim bildirimlerinden oluşan XML dosyaları |
Biçimler ve temalar | /res/values | Android uygulamanızın görünümü ile ilgili tanımlamaların yapıldığı dosyalar |
Animasyonlar | /res/animator | Animasyon API’si için XML dosyasında tanımlanan animasyonlar, nesnelerin zamanla nasıl şekilleneceğini belirlemenizi sağlar. |
Ham veri | /res/raw | Bu dosyalar ham olarak kaydedilir. InputStream nesnesini kullanarak bunlara erişebilirsiniz. |
Menüler | /res/menu | Uygulamanın araç çubuğunda kullanılan eylemleri tanımlamak için kulanılır. |
8.2. Örnek: Stringlerin, String dizilerinin, Renklerin ve Boyutların Tanımlanması
Örneğin; aşağıdaki /res/values dizinindeki values.xml dosyasında birkaç string sabiti, string dizisi, renk ve boyut tanımlanmıştır.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Test</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string-array name="operationsystems">
<item>Ubuntu</item>
<item>Android</item>
<item>Microsoft Windows</item>
</string-array>
<color name="red">#ff0000</color>
<dimen name="mymargin">10dp</dimen>
</resources>
8.3. Kaynak Dosyalar ve R.java
res dizinindeki tüm kaynaklara, Android build sistemi tarafından bir ID atanır. Android, üretilen değerleri içeren bir R.java dosyası oluşturur. Bu referanslar statik tam sayı değerlerdir.
Eğer yeni bir kaynak dosyası eklerseniz, buna ilişkin referans R.java dosyasında otomatik olarak yaratılır. R.java dosyasında doğrudan elle değişiklik yapmak gereksizdir, çünkü bu dosyayı güncelleyen araçlar bunun üzerine yazacaktır. Android sisteminin, bu kaynaklara ID’leri kullanarak erişmenizi sağlayacak metotları vardır.
Örneğin; kaynak kodunuzda R.string.yourString
ID’sine sahip bir string’e erişmek için Context
sınıfında tanımlanmış getString(R.string.yourString)
metodunu kullanabilirsiniz.
8.4. Yerleşim (layout) Dosyaları
Android activity’leri kullanıcı arayüzünü views(widget) ve fragments kullanarak oluşturur. Kullanıcı arayüzü XML yerleşim (layout) kaynak dosyaları aracılığıyla <filename class = “dosyaadı”> / res / layout_ klasöründe veya Java kodu aracılığıyla tanımlanabilir. Aynı anda iki yaklaşımı da kullanabilirsiniz.
Yerleşimleri, XML dosyaları kullanılarak yapmak tercih edilen yöntemdir. Bu yaklaşım, görsel arayüz ile kaynak kodu birbirinden ayırır. Bu aynı zamanda farklı cihazlar için, farklı yerleşimler tanımlamanıza da olanak sağlar.
Yerleşim kaynak dosyası layout olarak kullanılır. Bir yerleşim (layout); ViewGroups, Views, bunların ilişkileri ve özniteliklerini bir XML aracılığıyla gösterir.
Aşağıdaki örnekte basit bir layout dosyası gösterilmektedir.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/mytext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
Bir layout, setContentView()
metot çağrısıyla bir activity’e atanır. Aşağıda nasıl yapıldığına dair bir örnek kod bulunmaktadır.
package com.vogella.android.first;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
8.5. Layout Performansını İyileştirme
Yerleşimin hesaplanması ve görünümlerin çizilmesi, kaynak yoğun bir işlemdir. İyi bir performans için, olabildiğinde basit yerleşimleri kullanmalısınız. Örneğin; iç içe bir çok yerleşim kullanımı ya da basit bir yerleşim yeterli iken karmaşık bir yerleşimin kullanılmasından kaçınmalısınız.
8.6. Kaynak ID’leri İçin Doğru Uygulamalar
Bir view’a Java veya XML kodu yoluyla erişilmesi gerekiyorsa, android:id
özniteliği kullanılarak view’a bir tekil ID verilmelidir. Bir view’a yeni bir ID atamak için layout dosyasındaki ilgili öğenin android:id
özniteliğini kullanın.
Android SDK’sı ID’lerin isimlendirilmesinde camelCase notasyonunu kullanılır. Örn. buttonRefresh
. Bu yaklaşımı izlemek iyi bir uygulamadır.
Aşağıda, bir düğmenin android:id=”@+id/button1”
parametresi aracılığıyla atanan button1
ID’sini aldığı bir örnek gösterilmektedir. Bu ifade ile, gerekliyse R.java
dosyasında yeni bir ID oluşturulur ve tanımlanan ID’ye karşılık gelen görünüme (view) atanır.
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show Preferences" >
</Button>
Tüm ID’leri, tek bir ana yapılandırma dosyasında tanımlamak iyi bir uygulamadır. Genel olarak bu dosya ids.xml olarak isimlendirilir ve /res/values dizininde bulunur. Bu, yerleşim (layout) dosyanızda önceden tanımlanmış ID’leri kullanmanıza olanak tanır. ID’leri ayrı bir dosyada tanımlamak isterseniz, öncelikle yerleşim (layout) dosyalarınızdaki @+id girişlerini kaldırmanız gerekir, aksi halde bu dosyaların zaten oluşturulduğuna dair bir hata mesajı alırsınız. Aşağıda buna ilişkin dosya örneğini inceleyiniz.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="button1" type="id"/>
</resources>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<Button
android:id="@id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_marginRight="27dp"
android:text="Button" />
</RelativeLayout>
Gerçek projeler için yukarıdaki örnek iyi bir yaklaşımdır. Ancak bu anlatımdaki alıştırmalarda belirtilen yöntemin uygulanması zaman alacağı için, ayrı bir kimlik dosyası oluşturulmamaktadır. |
8.7. Sistem Kaynakları
Android, kendisi de bazı kaynaklar sağlar. Bunlara sistem kaynakları(system resources) denir. Android
isim alanı ön eki kullanılarak, bu kaynaklar yerel kaynaklardan ayrılır. Örneğin; android.R.string.cancel
iptal işlemi için bir platform string’i tanımlar.
9. Görünümler (views) ve Yerleşim Yöneticisi (layout manager)
9.1. View – Android kullanıcı arayüzü bileşenleri (widgets)
Android’de view bir görsel bileşeni tanımlar. Örn.; bir düğme ya da yerleşim yöneticisi. Android SDK’sı standart view (widgets)’ları sağlar. Örn.; Button
, TextView
, EditText
sınıfları. RecyclerView
gibi karmaşık görsel bileşenler ek kütüphaneler tarafından sağlanır.
Android’de bulunan tüm görünümler android.view.View
sınıfından türetilir, bu sınıf türeyen sınıflar için birçok temel işlevselliği sağlar. Örneğin; dokunma işlemleri gibi temel destekler söylenebilir.
View’ların ana paketleri, Android platformunun tüm varsayılan görsel bileşenleri (widget) ve tüm taban sınıfları için, android.widget ve android.view
isim alanının bir parçasıdır.
9.2. Yerleşim Düzenleyici (Layout Manager) Kullanımı
Layout manager kendi ve onun alt Views
’larının yerleşiminden sorumludur. ViewGroup
’dan türetilmiştir.
Android farklı varsayılan layout manager’ları desteklemektedir.
Android’de bulunan ve en çok kullanılan layout mangerlar:
Sabit (Constraint) Yerleşim - ek bir kütüphane gerektirir.
Doğrusal (Linear) Yerleşim
Çerçeve (Frame) Yerleşim
Göreli (Relative) Yerleşim
Izgara (Grid) Yerleşim
9.3. Yerleşim (layout) Öznitelikleri
Tüm layout manager’lar öznitelikler kullanılarak yapılandırılabilir. Alt yerleşimler de öznitelikler tanımlayabilir ve bunlar üst yerleşim tarafından kullanılır.
Alt yerleşimler, istenen genişlik ve yüksekliği aşağıdaki özelliklerle belirleyebilirler.
android:layout_width
– Görsel bileşenin genişliğini belirtir.android:layout_height
– Görsel bileşenin yükseliğini belirtir.
View’lar kendi boyutlarını tanımlayabilirler. Bu, ölçü birimleri ya da ön tanımlı yerleşim değerleri ile yapılabilir. Örneğin; 100dp
gibi.
match_parent
değeri uygulamaya görsel bileşenin için bulunduğu görünümün tamamını kaplamasını söyler. wrap_content
değeri, yerleşimin, görsel bileşenin doğru şekilde oluşturulması için en az miktarı tahsis etmesini söyler. Bunların nasıl çalıştığı aşağıda gösterilmektedir.
9.4. Sabit (Constraint) Yerleşim
Sabit yerleşim için dışsal bir kütüphane kullanılır. Bu, düz bir görünüm hiyerarşisi kullanmanıza ve yüksek performansa olanak tanır. Tasarım araçları da sabit yerleşimi desteklerler. Yeni projeler sabit yerleşimi kullanmayı tercih edebilirler.
9.5. Çerçeve (Frame) Yerleşim
FrameLayout
yerleşim yöneticisi, tüm alt öğeleri birbirinin üzerine gelecek şekilde çizer. Bu oldukça güzel görsel etkiler yaratmayı sağlar.
Aşağıdaki ekran görüntüsü FrameLayout
kullanan Gmail uygulamasını göstermektedir. Başka bir yerleşimin üzerinde düğmeler gösterilmektedir.
9.6. Doğrusal (Linear) Yerleşim
LinearLayout
tüm alt elemanları, android:orientation
özniteliğindeki değere bağlı olarak bir satır ya da sütuna koyar. Bu öznitelik için kullanılabilecek değerler; horizontal
(yatay) ve vertical
(dikey). Bu özniteliğin varsayılan değeri; horizontal
’dır.
Yatay bir yerleşim kullanıldıysa alt elemanların nasıl yerleştiğini aşağıdaki resimde görebilirsiniz.
Dikey bir yerleşimde aşağıdaki resimdeki gibi görülecektir.
LinearLayout
daha karmaşık yerleşimler oluşturmak için iç içe kullanılabilir.
LinearLayout
, android:layout_weight
yerleşim parametresi aracılığıyla alt elemanların kaplayacağı genişliği ayarlamayı destekler. Bu değer, yerleşimdeki ekstra alanın ne kadarının ilgili görünüme ayrıldığını belirtir. Örneğin; iki tane görsel bileşenden ilki layout_weight
özniteliğini 1, diğeri 2 olarak tanımladığında, ilki uygun olan alanın 1/3’ünü, diğeri 2/3’ünü kaplayacaktır. layout_width
‘i sıfır verirseniz, her zaman sabit bir orana sahip olur.
9.7. Göreli (Relative) Yerleşim
RelativeLayout
görsel bileşenleri birbirine göre konumlandırmaya izin verir. Bu karmaşık yerleşimler için kullanılabilir. RelativeLayout karmaşık bir yerleşim yöneticisidir ve alt bileşenler için, çok yoğun bir hesaplama gerçekleştirdiğinden bu yerleşim sadece gerekli ise kullanılmalıdır.
Bir bileşeni merkeze almak için temel bir RelativeLayout
kullanımı. RelativeLayout
‘a bir bileşen ekleyiniz ve android:layout_centerInParent
özniteliğini true olarak atayınız.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>
9.8. Izgara (Grid) Yerleşim
GridLayout
, Android 4.0 ile birlikte kullanılmaya başlandı. Bu yerleşim, görünümü ızgara biçiminde düzenlemenizi sağlar. GridLayout , çizim alanını satır, sütun ve hücreler şeklinde ayırır.
Her bir View
(görünüm) için tanımlamak istediğiniz sütun sayısını, hangi satır ve sütuna yerleştirileceğini ve kaç sütun ve satırın kullanılacağını belirtebilirsiniz. Eğer bunu belirtmezseniz, GridLayout
varsayılan değerleri kullanır. Bir satır, bir sutün ve görünümün pozisyonunu bildirim sırasına bağlı olacaktır.
Aşağıdaki yerleşim dosyası GridLayout
kullanımını göstermektedir.
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/GridLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnCount="4"
android:useDefaultMargins="true" >
<TextView
android:layout_column="0"
android:layout_columnSpan="3"
android:layout_gravity="center_horizontal"
android:layout_marginTop="40dp"
android:layout_row="0"
android:text="User Credentials"
android:textSize="32dip" />
<TextView
android:layout_column="0"
android:layout_gravity="right"
android:layout_row="1"
android:text="User Name: " >
</TextView>
<EditText
android:id="@+id/input1"
android:layout_column="1"
android:layout_columnSpan="2"
android:layout_row="1"
android:ems="10" />
<TextView
android:layout_column="0"
android:layout_gravity="right"
android:layout_row="2"
android:text="Password: " >
</TextView>
<EditText
android:id="@+id/input2"
android:layout_column="1"
android:layout_columnSpan="2"
android:layout_row="2"
android:inputType="textPassword"
android:ems="8" />
<Button
android:id="@+id/button1"
android:layout_column="2"
android:layout_row="3"
android:text="Login" />
</GridLayout>
Bu yerleşim dosyası, aşağıdaki ekran görüntüsünü oluşturur.
9.9. Kaydırma Görünümü (ScrollView)
ScrollView
ya da HorizontalScrollView
sınıfları yerleşim düzenleyiciler değildir. Eğer görünümler (view) ekrana tam olarak sığmazsa, onları görünür kılmak için kullanılırlar. ScrollView sadece bir tane görünüm (view) içerebilir. Yerleşim düzenleyiciler birden fazla görünüm (view) içerebilir. Eğer alt görünüm çok büyük ise, ScrollView içeriğin kayrılmasını sağlar.
Aşağıdaki kod, ScrollView
kullanan bir yerleşim düzenleyicisine ait örneği göstermektedir.
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:orientation="vertical" >
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="8dip"
android:paddingRight="8dip"
android:paddingTop="8dip"
android:text="This is a header"
android:textAppearance="?android:attr/textAppearanceLarge" >
</TextView>
</ScrollView>
android:fillViewport=”true”
özniteliği, öğeler bir ekrandan küçük olsa bile ScrollView’ın tam ekran olarak ayarlanmasını sağlar.
10. Alıştırma: Görünümlerle (view) İlk Etkileşiminiz
10.1. Üretilen Yerleşimin İncelenmesi
Alıştırma: Android Studio’yu kullanmaya başlamak oluşturmuş olduğunuz projede, res/layout
klasöründeki activity_main.xml
dosyasını açın.
XML düzen dosyasını, görsel düzenleyicide ya da XML görünümde inceleyebilirsiniz.
10.2. Görünümlerin (view) Düzenlenmesi
En üst giriş noktası olan yerleşim yöneticisi dışında tüm görünümleri kaldırın. Görsel düzenleyici modunda görünümün üzerine sağ tıklayın ve açılan menüden Sil ’i seçerek görünümü kaldırabilirsiniz.
Gerekirse yerleşim yöneticisini RelativeLayout
olarak değiştirin. Yerleşim dosyanız aşağıdakinin benzeri olacaktır.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
</RelativeLayout>
Android Studio, yer tutucu (placeholder) değerlerini gerçek değerlerle değiştirir. Bu bazen dosyaları karşılaştırmayı daha zor hale getirebilir. Bu durumda yer tutucunun değerini görmek için, bulunan değerin üzerine çift tıklayınız. |
Yerleşiminize, bir Metin alanı (EditText) ve Button ekleyiniz. En kolay yol, bu öğeleri Palette’te bulup, düzen dosyanızın üzerine sürükleyip bırakmaktır.
Yeni eklediğiniz EditText alanının id’sini main_input
olarak değiştirmek için metin (XML) düzenleyicisini kullanın. XML dosyasında @+id/main_input
gibi görünür.
Düğme metnini, yerleşim dosyanızdaki android:text
özniteliğinden Başlat olarak değiştirin. Button
’un android:onClick
özniteliğinin değerine onClick
yazınız.
Bu işlem, butona basıldığında, activity içerisinden public void onClick (View view) metodunun çağrılacağını belirtir. Bir sonraki adımda bu metodu yazacağız. |
Yaptığınız düzenlemelerden sonra yerleşim dosyanız aşağıdakinin benzeri olacaktır.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<EditText
android:id="@+id/main_input"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/main_input"
android:layout_below="@+id/main_input"
android:layout_marginTop="31dp"
android:onClick="onClick"
android:text="Start" />
</RelativeLayout>
Stringleri doğrudan yazdığınız için, düzenleyicide bazı uyarı mesajları göreceksiniz. Alıştırmalarda bu uyarılar gözardı edilebilir. |
10.3. Yerleşim Kontrol Edilmesi
Uygulamanızı emülatörde başlatabilirsiniz ya da IDE’de bulunan yerleşim gözden geçirme’yi (layout review) kullanabilirsiniz. Oluşturulan yerleşim dosyası, aşağıdaki ekran görüntüsünü oluşturacaktır.
Uygulamanızı çalıştırdıktan sonra düğmeye basarsanız uygulamanız çökecektir, çünkü hala activity’i düzenlemediniz.
10.4. Activity’nize Button Davranışı Yazın
MainActivity
sınıfınıza aşağıdaki kodu ekleyiniz.
public void onClick (View view) {
Toast.makeText(this, "Buton'a basıldı.",
Toast.LENGTH_LONG).show();
}
10.5. Button Etkileşiminin Kontrol Edilmesi
Uygulamayı Başlatın, Düğmeye basın ve açılır pencerenin açılıp (Toast) mesajınızın göründüğünü kontrol edin.
10.6. EditText Alanından Alınan Metinin Gösterilmesi
Kaynak koda geri dönün ve findViewById(id)
metodunu, doğru id
değeriyle çağırın ve geri dönüş değerini EditText
türüne dönüştürün.
EditText text = (EditText) findViewById(id)
R sınıfı aracılığı ile doğru id değerini elde edebilirsiniz. main_input olarak isimlendirilip, ID’lerin altında tutulur.
Girilen metni okumak için text.getText().toString()
metodunu kullanın ve aldığınız metini Toast mesajına ekleyiniz.
package com.vogella.android.first;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (BuildConfig.DEBUG) {
Log.d(Constants.LOG, "onCreated called");
}
setContentView(R.layout.activity_main);
}
// you may have here an onCreateOptionsMenu method
// this method is not required for this exercise
// therefore I deleted it
public void onClick(View view) {
EditText input = (EditText) findViewById(R.id.main_input);
String string = input.getText().toString();
Toast.makeText(this, string, Toast.LENGTH_LONG).show();
}
}
10.7. Açılır Pencere Mesajının Kontrol Edilmesi
Uygulamanızı yeniden başlatın ve açılır pencerede gösterilen mesajın, metin alanına girilenle aynı olup olmadığını kontrol edin.
11. Alıştırma: Çalışma Zamanında, Yerleşim Görünümünün Etkisi
Bu alıştırmada; Alıştırma: Android Studio’yu kullanmaya başlamak ve bunun üzerine geliştirdiğiniz Alıştırma: Görünümlerle (view) İlk Etkileşiminiz oluşturmuş olduğunuz yerleşime, RadioButon’lar ekleyeceksiniz. Kullanıcı seçimine bağlı olarak RadioButtonların yerleşimi, yataydan dikeye doğru değişecek.
11.1. Yerleşiminize, RadioGroup ve RadioButton Ekleyiniz
Yerleşim (layout) dosyasını açın, bir RadioGroup ve iki RadioButton ekleyin.
Aşağıdaki tabloda gösterilen değerleri atayınız.
ID | Görünüm |
---|---|
orientation | Radio Group |
horizontal | Birinci RadioButton |
vertical | İkinci RadioButton |
Yerleşim dosyanız aşağıdakinin benzeri olacaktır.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/main_input"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start"
android:id="@+id/button"
android:layout_below="@id/main_input"
android:layout_alignParentStart="true"
android:onClick="onClick"/>
<RadioGroup
android:id="@+id/orientation"
android:layout_below="@id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp">
<RadioButton
android:id="@+id/horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Horizontal" >
</RadioButton>
<RadioButton
android:id="@+id/vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="Vertical" >
</RadioButton>
</RadioGroup>
</RelativeLayout>
Yerleşiminize sadece RadioGroup kısmını eklemeniz yetecektir. Diğer kısımlar bir önceki alıştırma ile aynıdır. |
Yazdığınız yerleşim dosyası, aşağıdaki ekran görüntüsünü oluşturacaktır.
11.2. RadioGroup Yönünü Dinamik Olarak Değiştirme
Activity’nizin onCreate()
metodunu düzenleyiniz. Yerleşiminizde tanımladığınız RadioGroup
’u bulmak için findViewById()
metodunu kullanınız.
Radio Group’da, seçilen düğmeye göre, RadioButton’ların yönünü değiştiren bir dinleyici yazınız. Hangi düğmenin seçildiği, ID parametresinde tanımlanabilir.
RadioGroup , android.widget.RadioGroup paketinden setOnCheckedChangeListener () metodu ile, bir RadioGroup.OnCheckedChangeListener eklemenize izin verir. Eğer RadioGroup içerisinde seçim değişirse, dinleyici (listener) bundan haberdar olacaktır. Aşağıdaki kodu şablon olarak kullanarak bir dinleyici (listener) yazabilirsiniz. final RadioGroup group1 = (RadioGroup) findViewById(R.id.orientation); group1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.horizontal: group.setOrientation(LinearLayout.HORIZONTAL); break; case R.id.vertical: group.setOrientation(LinearLayout.VERTICAL); break; } } }); |
11.3. Kontrol
Uygulamanızı çalıştırın ve farklı radio düğmelerini seçin. Seçiminize göre, düğmelerin yönünün değiştiğinden emin olunuz.
12. Statik Kaynaklara Erişim ve Kullanımı
12.1. Kodda Bulunan Kaynak Referansları
Resources
sınıfı tekil kaynaklara erişmenizi sağlar. Resources
sınıfından bir nesne, Context
sınıfının getResources()
metodu aracılığıyla alınabilir. Activity’ler ve Service’ler Context
sınıfından türetilmiştir. Bu bileşenleri yazarken bu metodu doğrudan kullanabilirsiniz.
Resources
sınıfından bir nesne, Android geliştirme çatısında bulunan diğer sınıflar için de gereklidir. Örneğin, aşağıdaki kod örneği ID referansı kullanarak nasıl bir Bitmap
dosyası yaratıldığını göstermektedir.
// BitmapFactory sınıfı Resource sınıfı türünden bir nesneyi parametre olarak kullanır.
BitmapFactory.decodeResource(getResources(), R.drawable.ic_action_search);
12.2. Bir Activity’deki Yerleşimden, Görünümlere (views) Erişim
Activity (ve fragment) kodunda sıklıkla view’lara erişmeniz ve bunların özelliklerini düzenlemeniz gerekir.
Activity’de findViewById(id)
metodunu kullanarak, varolan yerleşimde bulunan bir view’a erişebilirsiniz. Id
, yerleşim dosyasında bildirmiş olduğunuz ID özniteliğidir. Bu metodun kullanımı, aşağıdaki kodda gösterilmektedir.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.mytext);
// TextView ile ilgili diğer işlemler
}
Aşağıdaki kod parçasında gösterildiği gibi, view hiyerarşisi içerisinde arama yapmak için findViewById(id)
metodu kullanılabilir.
// activity'den yerleşim dosyasının bulunması
LinearLayout linearLayout = (LinearLayout) findViewById(R.id.mylayout);
// linearlayout'tan başka bir view'ın bulunması
TextView textView = (TextView) linearLayout.findViewById(R.id.mytext);
// not, yukarıdaki kodda erişim için doğrudan R.id.mytext kullanabilirdiniz.
// bu sadece yapılabilirliğini göstermek içindir
Ayrıca, görünümlere erişimi kolaylaştıran bir yardımcı metot da oluşturabilirsiniz. package com.example.android.test; import android.app.Activity; import android.view.View; public class UiUtils { public static <T extends View> T findView(View root, int id) { return (T) root.findViewById(id); } public static <T extends View> T findView(Activity activity, int id) { return (T) activity.getWindow().getDecorView().getRootView().findViewById(id); } } Bu, görünüm hiyerarşinizde doğrudan dönüşüm olmadan görünümü bulmanıza olanak tanır. Button button = UiUtils.findView(this, R.id.button); |
12.3. XML Dosyalarında Kaynaklara Erişim
XML dosyalarınızda, @
işaretini kullanarak diğer kaynaklara erişebilirsiniz.
Örneğin; XML dosyasında tanımlanmış bir renge erişmek istiyorsunuz. Bunu @color/your_id
şeklinde yapabilirsiniz. Bir başka örnek, XML kaynağınızda “titlepage”
isimli bir String
tanımladığınızda, buna @string/titlepage
şeklinde erişebilirsiniz.
Bir Android sistem kaynağını erişim için android
isim alanını ekleyin. (ör. android.R.string.cancel
).
12.4. Varlık (Asset) Kullanımı
res dizini, Android platformu için semantik olarak tanımlı, yapılandırılmış veriler içerir. assets dizini, her türlü veriyi depolamak için kullanılabilir. Bu dizinde bulunan dosyalara, dosya yolunu yazarak erişebilirsiniz. assets dizininde alt klasörler de oluşturabilirsiniz.
/res/raw dizininde de yapılandırılmamış verileri depolayabilirsiniz. Ancak genel olarak, assets dizinini kullanmak tercih edilmelidir. |
Bu veriye, Context
nesnesinin getAssets()
metodu aracılığı ile elde edeceğiniz AssetsManager
’ı kullanarak erişebilirsiniz.
AssetsManager
sınıfının open()
metodu ile assets klasöründe bulunan dosyaları InputStream
olarak okuyabilirsiniz. Aşağıda buna ait örneği inceleyiniz.
// AssetManager nesnesi
AssetManager manager = getAssets();
// assets klasöründe bulunan "logo.png" okur
InputStream open = null;
try {
open = manager.open("logo.png");
Bitmap bitmap = BitmapFactory.decodeStream(open);
// Okunan bitmap, Yerleşim dosyasında bulunan ImageView'a atama.
ImageView view = (ImageView) findViewById(R.id.imageView1);
view.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (open != null) {
try {
open.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
13. Alıştırma: XML Dosyalarında ve Kaynak Kodda Kaynakların (resource) Kullanımı
13.1. Uygulamanıza Görseller Ekleyin
Bu alıştırmada var olan uygulamayı kullanmaya devam ediniz. Projeniz için ic_tethering ve ic_offline isimli iki yeni görsel yaratınız.
13.2. Yerleşiminizde Resim Göstermek İçin Bileşen Eklenmesi
Yerleşim (layout) dosyanızı açın ve ona yeni bir Button
ve ImageView
ekleyin. Aşağıdaki XML parçasında gösterildiği gibi, ic_offline dosyasını, layout dosyanız aracılığıyla ImageView
’a atayın.
<!--
NOT: Imageview'ın yerleşimi için
daha fala çznitelik gerekmektedir. Bunlar kısaca gösterim
için buraya alınmamıştır.
-->
<ImageView
android:id="@+id/myicon"
.... diğer öznitelikler
android:src="@drawable/ic_offline" />
13.3. Düğmeye Basıldığında Görselleri Değiştirin
Eğer düğmeye basılırsa, ImageView
’ı bulmak için findViewById()
metodunu kullanın. setImageResource()
metodunu kullanarak ImageView’a png dosyasını atayınız. setImageResource()
metodu parametre olarak, R ile elde ettiğiniz referansı alır. (ör. R.drawable.png_dosyanız).
13.4. Kontrol
Düğmeye bastığınızda görsellerin değiştiğine emin olunuz.
14. Alıştırma: ScrollView Kullanımı
Bu alıştırma, kaydırılabilir bir kullanıcı arayüzü için ScrollView
görünümünün (view) kullanımını gösterir. ScrollViewActivity isminde activity’e sahip bir de.vogella.android.scrollview Android projesi oluşturunuz.
Yerleşim dosyası olarak activity_main.xml
’i kullanınız.
Activity’deki yerleşim dosyasını aşağıdaki ile değiştiriniz.
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/LinearLayout01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingLeft="8dip"
android:paddingRight="8dip"
android:paddingTop="8dip"
android:text="This is a header"
android:textAppearance="?android:attr/textAppearanceLarge" >
</TextView>
<TextView
android:id="@+id/TextView02"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1.0"
android:text="@+id/TextView02" >
</TextView>
<LinearLayout
android:id="@+id/LinearLayout02"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<Button
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:text="Submit" >
</Button>
<Button
android:id="@+id/Button02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1.0"
android:text="Cancel" >
</Button>
</LinearLayout>
</LinearLayout>
</ScrollView>
ScrollViewActivity
sınıfınızı aşağıdaki kodla değiştirin.
package de.vogella.android.scrollview;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class ScrollViewActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView view = (TextView) findViewById(R.id.TextView02);
String s="";
for (int i=0; i < 500; i++) {
s += "vogella.com ";
}
view.setText(s);
}
}
Uygulamanızı başlatın ve düğmeler aracılığıyla kaydırabildiğinizi kontrol ediniz.
15. Alıştırma: Sıcaklık Dönüştürücü
Bu alıştırmada Android kaynaklarının nasıl oluşturulacağını ve kullanılacağını öğreneceksiniz.
Bu uygulama Google Play’de bulunmaktadır ve aşağıdaki bağlantıyı kullanarak erişebilirsiniz. http://play.google.com/store/apps/details?id=de.vogella.android.temperature
Ayrıca aşağıdaki karekodu Android telefonunuzla tarayıp, Google Play uygulaması aracılığıyla da yükleyebilirsiniz.
15.1. Projeyi Oluşturma
Aşağıdaki verileri kullanarak yeni bir Android projesi oluşturunuz.
Özellik | Değer |
---|---|
Uygulama Adı | Sıcaklık Dönüştürücü |
Paket Adı | com.vogella.android.temperatureconverter |
API (En az, Hedef, Derleme) | En son (Latest) |
Şablon | Boş Activity (Empty Activity) |
Activity | MainActivity |
Layout (Yerleşim) | activity_main |
15.2. Öznitelik Oluşturma
Düzenleyicide res/values/strings.xml dosyasını açınız. Color
(renk) ve String tanımlamalarını aşağıdaki tabloda gösterildiği gibi ekleyiniz.
Tür | İsim | Değer |
---|---|---|
Color | myColor | #F5F5F5 |
String | celsius | to Celsius |
String | fahrenheit | to Fahrenheit |
String | calc | Calculate |
Girdiğiniz değerler sonucunda dosyanız aşağıdaki gibi olacaktır.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Temperature Converter</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<color name="myColor">#F5F5F5</color>
<string name="celsius">to Celsius</string>
<string name="fahrenheit">to Fahrenheit</string>
<string name="calc">Calculate</string>
</resources>
15.3. Yerleşimin Oluşturulması
Editörde res/layout/activity_main.xml dosyasını açınız.
Yerleşim dosyanızda varolan görünümleri, doğrudan XML dosyasından ya da görsel editörü kullanarak silin.
Bir tane LinearLayout, alt bileşenleri ViewText ve EditText olan diğer bir LinearLayout ekleyiniz. Bunun ardından yerleşiminize iki RadioButton ve Button içeren bir RadioGroup ekleyiniz. Bu işlemleri doğrudan XML dosyasından ya da görsel editör üzerinden yapabilirsiniz. En kolay yol, görsel editörde Component Tree üzerinden bileşenleri sürükle bırak ile düzenlemektir.
Sonuç, aşağıdaki ekran görüntüsü gibi olacaktır. Birinci görsel, bileşen görünümünü, ikincisi ise önizlemeyi gösterir.
Layout dosyanızın XML sekmesini açınız ve aşağıdakiyle benzer olup olmadığını kontrol ediniz.
Android araçları ekibi, üretilen kodu zaman zaman değiştirir; dolayısıyla XML’iniz biraz farklı görünebilir. |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
android:background="@color/myColor">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText1" />
<RadioGroup
android:id="@+id/radioGroup1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/editText1"
android:layout_below="@+id/editText1">
<RadioButton
android:id="@+id/radio0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="RadioButton" />
<RadioButton
android:id="@+id/radio1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton" />
</RadioGroup>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/radioGroup1"
android:layout_below="@+id/radioGroup1"
android:layout_marginTop="22dp"
android:text="Button" />
</LinearLayout>
Birkaç uyarı mesajı göreceksiniz. Bu alıştırmada aldığınız uyarıları aşağıdaki bölümde düzeltiniz. |
15.4. Görünüm (view) Özelliklerini Düzenleme
Dosyada XML görünümüne geçin ve ilk RadioButton’un android:text
özelliğine @string/celsius
değerini verin. İkinici RadioButton’un text
özelliğine fahrenheit
string özniteliğini atayın.
İlk RadioButton
’un Checked
özniteliğinin true
olarak ayarlandığından emin olun.
@string/calc
değerini düğmenin text özelliğine atayın ve onClick
değerini OnClick
özniteliğine atayın.
EditText
’in inputType
özelliğini numberSigned
ve numberDecimal
olarak ayarlayın. Örnek olarak, aşağıdaki XML’in son satırını kullanabilirsiniz. Ayrıca ID’sini “inputValue” olarak değiştirin.
<EditText
android:id="@+id/inputValue"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_below="@+id/textView"
android:ems="10"
android:inputType="numberSigned|numberDecimal" />
Kullanılan tüm kullanıcı arayüzü bileşenleri yerleşim dosyasında bulunur. Bu Layout
’a arkaplan rengi atayın.
Açılan pencereden Color’u ve ardından myColor
’u seçin. Örnek olarak, aşağıdaki XML’in son satırını kullanabilirsiniz.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
android:background="@color/myColor">
Bunun ardından, arkaplan whitesmoke
(duman beyazı) rengine dönüşmelidir. Farkı görmek biraz zor olabilir.
Activity_main.xml sekmesine geçin ve XML’in doğru olup olmadığını kontrol edin.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity"
android:background="@color/myColor">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/inputValue"
android:inputType="numberSigned|numberDecimal"/>
<RadioGroup
android:id="@+id/radioGroup1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/editText1"
android:layout_below="@+id/editText1">
<RadioButton
android:id="@+id/radio0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="true"
android:text="@string/celsius" />
<RadioButton
android:id="@+id/radio1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/fahrenheit" />
</RadioGroup>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/radioGroup1"
android:layout_below="@+id/radioGroup1"
android:layout_marginTop="22dp"
android:text="@string/calc"
android:onClick="onClick"/>
</LinearLayout>
15.5. Destek(utility) Sınıfı Oluşturmak
Santigrattan, Fahrenhayta ve tersi dönüşüm için aşağıdaki utility sınıfını yaratınız.
package com.vogella.android.temperatureconverter;
public class ConverterUtil {
// santigrad'a dönüştür
public static float convertFahrenheitToCelsius(float fahrenheit) {
return ((fahrenheit - 32) * 5 / 9);
}
// fahrenhayt'a dönüştür
public static float convertCelsiusToFahrenheit(float celsius) {
return ((celsius * 9) / 5) + 32;
}
}
15.6. Activity Kodunun Değiştirilmesi
Aşağıdaki MainActivity
ile değiştirin.
package com.vogella.android.temperatureconverter;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText text;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (EditText) findViewById(R.id.inputValue);
}
// Düğmeye basıldığında bu metot çağırılacaktır. Çünkü Button'un "OnClick" özniteliğine
// bu metot ismi atandı
public void onClick(View view) {
switch (view.getId()) {
case R.id.button1:
RadioButton celsiusButton = (RadioButton) findViewById(R.id.radio0);
RadioButton fahrenheitButton = (RadioButton) findViewById(R.id.radio1);
if (text.getText().length() == 0) {
Toast.makeText(this, "Geçerli bir sayı giriniz",
Toast.LENGTH_LONG).show();
return;
}
float inputValue = Float.parseFloat(text.getText().toString());
if (celsiusButton.isChecked()) {
text.setText(String
.valueOf(ConverterUtil.convertFahrenheitToCelsius(inputValue)));
celsiusButton.setChecked(false);
fahrenheitButton.setChecked(true);
} else {
text.setText(String
.valueOf(ConverterUtil.convertCelsiusToFahrenheit(inputValue)));
fahrenheitButton.setChecked(false);
celsiusButton.setChecked(true);
}
break;
}
}
}
15.7. Uygulamayı Başlatma
Android uygulamanızı çalıştırın, bir sayı girin, dönüşüm yapacağınız birimi seçin ve düğmeye basın. Sonuç gösterilecek ve diğer seçenek seçilmiş olacaktır.
16. Dağıtım (Deployment)
16.1. Nasıl Dağıtım Yapılır
Genel olarak, bir Android uygulamasını cihazınıza dağıtım yapabilmenize ilişkin kısıtlamalar vardır. Uygulamayı USB aracılığıyla test modunda cihazınıza gönderebilir, uygulamayı kendinize e-postayla gönderebilir ya da uygulamayı kurmak için farklı Android marketlerinden birini kullanabilirsiniz. Aşağıdaki açıklama en yaygın olanları göstermektedir.
16.2. Uygulama için Yazılım ve Donanım Gereksinimlerini Tanımlama
Hangi yazılım ve donanım gereksinimlerinin gerekli olduğunu, uygulamanın manifest dosyasında <uses-feature> bildirimi ile tanımlayabilirsiniz. Android android:required
özelliği sayesinde uygulama, uygulamanın doğru çalışması için bu özelliğin gerekli olup olmadığını (true) veya uygulamanın bu özelliği aygıtta mevcutsa kullanıp kullanmamayı tercih ettiğini tanımlayabilir. Ancak gerektiğinde uygulama belirtilen özellik olmadan da çalışmak üzere tasarlanmıştır.
Bu tanımlamalara örnek olarak, belirli bir donanım sensörünün ya da kameranın bulunup bulunmadığı verilebilir.
Mevcut kısıtlamalara genel bir bakış için http://developer.android.com/guide/topics/manifest/uses-feature-element.html bakınız.
16.3. Uygulama Sürümünün İmzalanması
Android uygulamaları, cihaza yüklenmeden önce imzalanmalıdır. Uygulama geliştirilirken build sistemi, uygulamayı bir debug anahtarıyla otomatik olarak imzalar.
Android uygulamasını başka bir kanal aracılığıyla kurmak için Android apk’sını kendi imza anahtarınızla imzalamanız gerekir.
Başvurunuzu güncellemek için Google Play’de (Google Market’te) aynı imza anahtarını kullanmanız gerektiğini unutmayınız. Anahtarı kaybederseniz, uygulamanızı bir daha güncelleyemeyeceksiniz.
Anahtar değerini yedeklemeyi unutmayınız.
16.4. Uygulamanızı Android Studio’dan Dışa Aktarın
Android Studio’da Build ▸ Generate Signed APK… menüsünden uygulamanın dışarı aktarımını başlatabilirsiniz.
16.5. Uygulamanızı Eclipse IDE’den Dışa Aktarın
Eclipse IDE üzerinden uygulamanızı dışarı aktarmak isterseniz, projenizin üzerine sağ tıklayınız ve Android Tools ▸ Export Signed Application Package seçiniz.
Bu sihirbaz mevcut bir anahtarın kullanılmasına ya da yeni bir anahtarın oluşturulmasına olanak tanır.
16.6. Dışsal Kaynaklar Aracılığıyla
Android uygulamalarının doğrudan kurulmasına da izin verir. Bir .apk dosyasını (örneğin bir e-posta eki veya bir web sayfasında) gösteren bağlantıya tıklayınız. Android, bu uygulamayı yüklemek isteyip istemediğinizi soracaktır.
Market-dışı (non-market) uygulama kurabilmek için, Android cihazınızda buna izin veren ayarlamayı yapmanız gerekir. Genellikle bu işlemi “Güvenlik” ayarları bölümünden yapabilirsiniz.
16.7. Google Play (Market)
Google Play sadece bir sefer üyelik ücreti almaktadır ve şu an yaklaşık olarak 25 Dolardır. Bundan sonra geliştirici, uygulamasını ve gerekli simgeleri Google Play Publishing’de doğrudan yükleyebilir.
Google, uygulamaların otomatik olarak taranmasını gerçekleştirir ancak onay işlemi yerine geçmez. Kötü amaçlı yazılım içermeyen tüm uygulamalar yayınlanır. Yükleme işleminden birkaç dakika sonra uygulama yayınlanır.
17. Bu Web Sitesi Hakkında
Ücretsiz içerik için destek
Sorular ve tartışma
Eğitim & Kod lisansı
Kaynak kodları indir
18. Çevrimiçi Android Kaynakları
18.1. Temel Android Kaynakları
Android Geliştiricileri Anasayfa
vogella Android çevrimiçi dersler
Çalışma zamanı izinlerini gsteren kod örnekleri
18.2. Android Öğrenmek için Kaynaklar
Android ile ilgili Google geliştiricilerinin podcastleri
Fragmented[Bir Android Geliştiricisi] Podcast
18.3. Android Araçları
Android araçları ile ilgili son değişiklikler
Android Dex ve Apk dosyalarından Java kaynak kodu üretmek için, komut satırı ve GUI araçları
18.4. Vogella GmbH Eğitim ve Danışmanlık Desteği
EĞİTİM | SERVİS&DESTEK |
---|---|
Vogella şirketi, Eclipse RCP, Android, Git, Java, Gradle ve Spring alanlarındaki uzmanlardan, kapsamlı eğitim ve öğretim hizmetleri sunmaktadır. Hem genel kurslar, hem de kurum içi eğitim sunuyoruz. Hangi kursu almaya karar verirseniz verin, “şimdiye kadar katıldığım en iyi BT sınıfı”. diyerek ayrılacağınıza garanti veriyoruz. | Vogella şirketi, uzman danışmanlık, geliştirme desteği ve koçluk hizmeti sunmaktadır. Bireysel yazılım geliştiricilerden, Fortune 100 şirketlerine kadar müşteri çeşitliğine sahiptir. |
Ek A: Telif Hakkı ve Lisans
Copyright © 2012-2016 vogella GmbH. Kod örneklerinin özgürce kullanımı için; EPL Lisansı geçerlidir. Bu eğitim Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Germany lisansı altında yayımlanmıştır.
Bakınız Lisans
Sürüm 14.4
Son güncelleme tarihi 21.11.2016 11:51:10 +01:00