İçeriğe geç

 

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.

Android’in yazılımsal katmanları

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.

Tablo 1. Android sürümleri

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.

Eclipse tarafından Gradle’in desteklenmesi için oy veriniz.

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.

Eclipse’in Google tarafından desteklenmesi için oy veriniz.

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.

Android Studio Kurulumu

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.

Android Studio, yapılandırma sihirbazı

Sonra kurulum adımlarını takip ediniz.

Android Studio, yapılandırma sihirbazı
Android Studio, yapılandırma sihirbazı
Android Studio, yapılandırma sihirbazı

Son sayfaya ulaştığınızda Finish’e tıklayınız.

Android Studio, yapılandırma sihirbazı

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.

Yeni Android Studio projesi oluşturmak

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.

Tablo 2. Android projeniz için ayarlar
Ö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)

Yeni Android Studio projesi oluşturmak
Yeni Android Studio projesi oluşturmak

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.

Yeni Android Studio projesi oluşturmak

Bunun ardından Empty Activity şablonunu seçiniz.

Yeni Android Studio projesi oluşturmak

En son sayfada, Geriye Dönük Uyumluluk (Backwards Compatibility) seçeneğinin işaretli olmadığından emin olunuz.

Yeni Android Studio projesi oluşturmak

3.2. Üretilen Projenin İncelenmesi

Sihirbaz bir Android projesi oluşturacak. Üretilen projenin yapısını ve dosyalarını gözden geçirin.

as first70
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.

Create a new AVD

Siz de aşağıdaki ekran görüntüsündeki değerleri seçiniz.

Yeni AVD için ayarlar

Bu ekranda AVD için, en son API seviyesini (API Level) seçiniz. Sekmelerden sisteminiz için ek imajlar (Images) seçebilirsiniz.

Yeni AVD için ayarlar
Yeni AVD için ayarlar

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

Yeni AVD için ayarlar

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.

Yeni AVD için ayarlar

Bir süre sonra uygulamanız, sanal cihaz üzerinde çalışacaktır.

Yeni AVD için ayarlar

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.

Android Studio, Android SDK Yöneticisi

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.

Android API kurulumu

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.

Emülatörü başlatma seçenekleri

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 emülatörü
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.

Intel emülatörü

İ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.

Tablo 3. Android uygulaması bileşenleri
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.

Aynı anda sadece bir tane fragment gösterilir.
İki fragment yan yana

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.

Tablo 4. En düşük ve hedef sürüm
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.

Tablo 5. Kaynaklar (Resources)
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.

wrap_content ile yerleşim.

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.

Çerçeve (Frame) Yerleşim

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.

linearlayout20

Dikey bir yerleşimde aşağıdaki resimdeki gibi görülecektir.

linearlayout10

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.

GridLayout Activity sonucu

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.

Scroll view

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.

Son görünüm

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.

Tablo 6. ID Atama
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.

Yerleşimi göster

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, Contextsı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.

Çalışan bir ScrollView uygulamasının gösterimi.

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.

Android Sıcaklık dönüştürücüyü yüklemek için QR Kodu

15.1. Projeyi Oluşturma

Aşağıdaki verileri kullanarak yeni bir Android projesi oluşturunuz.

Tablo 7. Yeni Android projesi
Ö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.

Tablo 8. Eklenecek öznitelikler
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.

Bileşen görünümü (Component view)
activity_main.xml’in şu anki yerleşimi

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.

RadioButton’un text özelliğini değiştirin

İ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.

RadioButton’un text özelliğini değiştirin

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.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.

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