Skip to content

Commit

Permalink
SH-19 Review, fix typo and imrpove
Browse files Browse the repository at this point in the history
  • Loading branch information
Murat Kemal BAYGÜN committed May 30, 2014
1 parent 65c3748 commit d682105
Showing 1 changed file with 47 additions and 45 deletions.
92 changes: 47 additions & 45 deletions source/posts/2014-05-09-android-temelleri.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ author: hamitturkukaya
tags: android, mobile development, java, tr
---

Merhabalar Java ile Android uygulamaları temelleri hakkında bir giriş yapmak istiyorum. Bunun için işletim sisteminize uygun jdk ve android sdk yı indirmeniz gerekmektedir.
Windows ve Mac OSX için JDK ve JRE'yi [buradan](http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=otnjp) indirebilirsiniz.
Merhabalar, Java ile Android uygulamaları temelleri hakkında bir giriş yapmak istiyorum. Bunun için işletim sisteminize uygun JDK ve Android SDK' yı indirmeniz gerekmektedir.
Windows ve Mac OSX için JDK ve JRE' yi [buradan](http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=otnjp) indirebilirsiniz.

Ubuntu veya Linux Mint için ise;
Ubuntu veya Linux Mint için ise:

```
sudo apt-get install python-software-properties
Expand All @@ -22,52 +22,54 @@ Ubuntu veya Linux Mint için ise;

komutlarını kullanabilirsiniz.

Kurulumun ardından Android SDK'yı ve IDE'mizi indirmemiz gerekmekte. [Buradan](http://developer.android.com/sdk/index.html) eclipse ile Android SDK'mızı indirebiliriz.
İsterseniz Eclipse yerine [IntelliJIdea](http://www.jetbrains.com/idea/) tabanlı [Android Studio](http://developer.android.com/sdk/installing/studio.html)'yu da deneyebilirsiniz
Kurulumun ardından Android SDK'yı ve IDE'mizi indirmemiz gerekmekte. [Buradan](http://developer.android.com/SDK/index.html) Eclipse ile Android SDK' indirebiliriz.
İsterseniz Eclipse yerine [IntelliJIdea](http://www.jetbrains.com/idea/) tabanlı [Android Studio](http://developer.android.com/SDK/installing/studio.html)' yu da deneyebilirsiniz,
fakat hala alpha aşamasında olduğu için ben tercih etmiyorum.

## Eclipse

![eclipse](/assets/images/articles/2014-05-09-android-temelleri/eclipse.png)

Eclipse'i açtığımızda sol üstte işaretli 2 ikonumuzu göreceğiz. Bunlardan soldaki Android SDK Manager, yani farklı versiyonlar için android sdk yüklemeleri yapabileceğimiz kısım,
sağ taraftaki penceremiz ise Android Virtual Device Manager'dır. Burada da emulatör ile android bir cihaz oluşturup testlerimizi onun içinde yapabiliriz.
Eclipse' i açtığımızda sol üstte işaretli 2 ikonumuzu göreceğiz. Bunlardan soldaki Android SDK Manager, yani farklı versiyonlar için Android SDK yüklemeleri yapabileceğimiz kısımdır.
Sağ taraftaki ise Android Virtual Device Manager' dır. Burada da emulatör ile Android bir cihaz oluşturup, testlerimizi onun içinde yapabiliriz.
Fakat maalesef bu araç çok yavaş olduğu için GenyMotion adlı 3. parti emulatörü kullanmanızı öneririm. Standart özellikleri ücretsiz gelmektedir ve standart emülatöre
göre çok daha hızlıdır. (Tabii ki en iyi sonucu gerçek bir cihaz üzerinden alırsınız). GenyMotion'ı [buradan](https://cloud.genymotion.com/page/customer/login/?next=/) üye olduktan sonra
göre çok daha hızlıdır. (Tabii ki en iyi sonucu gerçek bir cihaz üzerinden alırsınız). GenyMotion' ı [buradan](https://cloud.genymotion.com/page/customer/login/?next=/) üye olduktan sonra
indirebilirsiniz.

## İlk uygulamayı oluşturma

İlk Android uygulamamızı oluşturmak için File > New > Android Application Project seçiyoruz
İlk Android uygulamamızı oluşturmak için File > New > Android Application Project seçiyoruz.

![New App](/assets/images/articles/2014-05-09-android-temelleri/newapp.png)

Ve uygulamamız için gerekli bilgileri giriyoruz.
Sonrasında uygulamamız için gerekli bilgileri giriyoruz.

![Naming](/assets/images/articles/2014-05-09-android-temelleri/naming.png)

_**Application name:**_ Play Store'da gözükecek uygulama adıdır
_**Application name:**_ Play Store' da gözükecek uygulama adıdır

_**Package name:**_ Classlarımızı tutacak genel paket adıdır. Genellikle 'com.sirket_adi.uygulama_adi' olarak belirlenir.

_**Minimum Required SDK**_ ve _**Target SDK**_ uygulamamızın Android'in hangi sürümlerinde çalışacağını belirtir. Target SDK en son çıkan sdk seçilmelidir
_**Minimum Required SDK**_ ve _**Target SDK**_, uygulamamızın Android'in hangi sürümlerinde çalışacağını belirtir. Target SDK, en son çıkan SDK seçilmelidir.

Sonraki pencerelerde varsayılan değerler korunarak proje oluşturma işlemi tamamlanır.

## Klasörler

![Folders](/assets/images/articles/2014-05-09-android-temelleri/folders.png)

İlk uygulamamızı oluşturduk ve resimdeki gibi klasörler karşımıza geldi. Burada haşır neşir olacağımız kısımlar.
İlk uygulamamızı oluşturduk ve resimdeki gibi klasörler karşımıza geldi. Burada haşır neşir olacağımız kısımlar,
_**SRC**_ ve _**RES**_ klasörleridir. Genel olarak klasörlerin görevleri şunlardır:

_**Gen**_, hiç bir zaman müdahale etmemeniz gereken, android in kendi değişkenlerini adresleyip, değişkenler halinde tuttuğu classları içeren klasördür.
_**Gen**_, hiç bir zaman müdahale etmemeniz gereken, Android' in kendi değişkenlerini adresleyip, değişkenler halinde tuttuğu classları içeren klasördür.

_**Bin**_, derlenmiş classlarımızı ve çalıştırılabilir apk dosyamızı içeren klasördür.

_**Libs**_, uygulamaya dahil edilen kütüphaneler bu klasördedir. (Android SDK gibi)

_**RES**_, assetlerimizi tutmak içindir (resimler, arayüz dosyalarımız, rakamsal veya string değerlerimiz vs.)

_**Drawable**_, resimlerimizin, stil dosyalarımızın bulunacağı klasördür. yanlarındaki hdpi, ldpi, mpdi, xhdpi ise ekran boyutlarını belirtir. Bu şekilde uygulamaya özel arayüz tasarlayabilirsiniz.
_**Drawable**_, resimlerimizin, stil dosyalarımızın bulunacağı klasördür. Yanlarındaki hdpi, ldpi, mpdi, xhdpi ise ekran boyutlarını belirtir. Bu şekilde uygulamaya özel arayüz tasarlayabilirsiniz.
Örneğin 10" bir tabletteki resmin boyutu ve çözünürlüğü 3" bir telefondakinden büyük olmalıdır. Bunları burada ayarlayabilirsiniz.

_**Layout**_, arayüz xmllerini saklayan klasördür. Bu klasörün yanına istediğiniz gibi _layout_hdpi_, _layout_ldpi_ gibi klasörler ekleyerek arayüzleri özelleştirebilirsiniz.
Expand All @@ -77,34 +79,34 @@ _**Menu**_, uygulamanızda görünecek menüleri tutan klasördür
_**Values**_, uygulama içerisinde kullanacağımız değerleri tutacağımız klasördür. Arayüzdeki margin değerlerinden buton textlerine kadar herşeyi burada tutabilirsiniz.
values-en, values-tr şeklinde klasörlerle sadece içerisindeki değerleri değiştirerek telefonun diline göre uygulamanın dilini değiştirebilirsiniz.

Bunların dışında içli dışlı olacağımız bir başka dosya _**AndroidManifest.xml**_ dosyasıdır. Bu dosya içerisinde uygulama ayarlarımız, izinlerimiz, activitylerimiz gibi bilgiler
Bunların dışında içli dışlı olacağımız bir başka dosya, _**AndroidManifest.xml**_ dosyasıdır. Bu dosya içerisinde uygulama ayarlarımız, izinlerimiz, activitylerimiz gibi bilgiler
bulunmaktadır.


Bu bilgilerin ardından gelelim layout klasörümüze.
Bu bilgilerin ardından gelelim layout klasörümüze:

Layout klasörünün içine girdiğimiz zaman 2 adet dosya oluştuğunuz görüyoruz. _**activity_main.xml**_ ve _**fragment_main.xml**_ bunlar arayüz dosyalarımızdır.
(Eski sdk'ya sahip olan kullanıcılarda sadece activity_main.xml olacaktır.) Ne işe yaradıklarını açıklayalım. Android'de bir çok ekran sistemi vardır bunlara _**Activity**_ denir. Uygulamada işlem
yaptığınız her ekranı bir activity olarak düşünebilirsiniz. Bunun yanısıra API 11(Android 3.0)den sonra Fragment yapısı daha getirildi. Bunu da Activity içerisinde çalışan bir
arayüz ya da bir işlemi temsil eden küçük activity parçaları olarak düşünebiliriz. Bir container activity içerisinde birden fragmentleri tetikleterek çağırmak hem performans hem
tekrar kullanılabilirlik açısından daha verimlidir. Tabi fragmentler de activityden bağımsız değildir. Onların yaşam döngüleri de onu içeren aktiviteye bağlıdır. Activity kapandığı
Layout klasörünün içine girdiğimiz zaman 2 adet dosya oluştuğunu görüyoruz. _**activity_main.xml**_ ve _**fragment_main.xml**_ bunlar arayüz dosyalarımızdır.
(Eski SDK' ya sahip olan kullanıcılarda sadece activity_main.xml olacaktır.) Ne işe yaradıklarını açıklayalım. Android' de bir çok ekran sistemi vardır. Bunlara _**Activity**_ denir. Uygulamada işlem
yaptığınız her ekranı bir activity olarak düşünebilirsiniz. Bunun yanısıra API 11(Android 3.0)' den sonra Fragment yapısı ek olarak getirildi. Bunu da Activity içerisinde çalışan bir
arayüz ya da bir işlemi temsil eden küçük activity parçaları olarak düşünebiliriz. Bir container activity içerisinde birden fragmentleri tetikleterek çağırmak, hem performans, hem de
tekrar kullanılabilirlik açısından daha verimlidir. Tabi fragmentler de activity' den bağımsız değildir. Onların yaşam döngüleri de onu içeren aktiviteye bağlıdır. Activity kapandığı
zaman içerdiği fragment de kapanır.

Bu kısa ön bilgiden sonra tahmin edebileceğiniz gibi activity_main.xml fragmenti tutacak container activity arayüzü iken, fragment_main.xml ise içerisinde çalıştırılacak
Bu kısa ön bilgiden sonra tahmin edebileceğiniz gibi activity_main.xml, fragmenti tutacak container activity arayüzü iken; fragment_main.xml ise, içerisinde çalıştırılacak
fragment arayüzüdür.

![Activity](/assets/images/articles/2014-05-09-android-temelleri/newactivity.png)


![Activity](/assets/images/articles/2014-05-09-android-temelleri/ewfragment.png)
![Activity](/assets/images/articles/2014-05-09-android-temelleri/newfragment.png)

Layout görünümü içerisinde arayüzü 2 farklı şekilde görüntüleyebiliriz.
_**Graphical Layout**_: Arayüzün olduğu gibi gösterildiği, componentlerin sürükle bırak ile eklenebileceği grafik arayüzüdür.
_**Graphical Layout**_: Arayüzün olduğu gibi gösterildiği, bileşenlerin sürükle bırak ile eklenebileceği grafik arayüzüdür.
_**XML Editör**_: Xml dosyasını manuel olarak oluşturabileceğiniz editördür

Not: Düzenlemeler için xml'e eninde sonunda elle müdahale etmeniz gerekecektir. Arayüz aracı çok gelişmiş durumda değil.
Not: Düzenlemeler için xml' e eninde sonunda elle müdahale etmeniz gerekecektir. Arayüz aracı çok gelişmiş durumda değil.

xml dosyalarını arayüz altındaki activity_main.xml ve activity_fragment.xml e tıklayarak açalım
xml dosyalarını arayüz altındaki activity_main.xml ve activity_fragment.xml' e tıklayarak açalım

_**activity_main.xml**_

Expand All @@ -119,8 +121,8 @@ _**activity_main.xml**_
```


Burada sadece pencere olacağını belirten FrameLayout olarak id'si container olan bir arayüz elementi oluşturulduğunu görüyoruz.
Fragment'imizdeki içerik bu FrameLayoutun içerisine eklenecektir.
Burada, sadece pencere olacağını belirten FrameLayout olarak id' si container olan bir arayüz elementi oluşturulduğunu görüyoruz.
Fragment' imizdeki içerik bu FrameLayout' un içerisine eklenecektir.

_**fragment_main.xml**_

Expand All @@ -143,11 +145,11 @@ _**fragment_main.xml**_
</RelativeLayout>
```

Burada da içerisinde bir adet TextView bulunan RelativeLayout tanımlanmıştır. Layoutlar içerisinde en çok kullanılan 2 tip layout vardır. Relative ve Linear Layout; isimlerinden de anlaşılabileceği
gibi RelativeLayout içerisindeki elemanları birbirlerine göre uzaklığı, konumu gibi bilgiler ile yerleşim yaparken, LinearLayout ile yatay veya dikey olarak elemanları yerleştirir.
Layoutlar iç içe kullanıllabilir.
Burada da, içerisinde bir adet TextView bulunan RelativeLayout tanımlanmıştır. Layoutlar içerisinde en çok kullanılan 2 tip layout vardır. Relative ve Linear Layout; isimlerinden de anlaşılabileceği
gibi RelativeLayout, içerisindeki elemanları birbirlerine göre uzaklığı, konumu gibi bilgiler ile yerleşim yaparken, LinearLayout ise, yatay veya dikey olarak elemanları yerleştirir.
Layoutlar iç içe kullanılabilir.

TextView'ımız ise uygulamamızın içerisinde düz metin göstermek için kullanabileceğimiz label'lardır. text değerine _"@string/hello_world"_ değeri atanmıştır. Bu da bu içeriğin
TextView' ımız ise uygulamamızın içerisinde düz metin göstermek için kullanabileceğimiz label' lardır. text değerine _"@string/hello_world"_ değeri atanmıştır. Bu da bu içeriğin
"res/values/strings.xml" dosyası içerisinde tutulduğunu belirtir. Layout içerisindeki yazıları strings.xml dosyasında tutmak best practice olarak önerilmektedir.

```xml
Expand All @@ -161,10 +163,10 @@ TextView'ımız ise uygulamamızın içerisinde düz metin göstermek için kull
</resources>
```

Not: String'ler, id ler otomatik olarak adreslenip "Gen/R.class" içerisine yazılmaktadır, bu nedenle aynı string adı ve idler farklı xml dosyalarında kullanılsa bile eşsiz olmalıdır.
Mesela yukarıdaki xml lere bakarak id si container olan başka bir component veya adı hello_world olan başka bir string oluşturmamız hatalara neden olacaktır.
Not: String' ler, id' ler otomatik olarak adreslenip "Gen/R.class" içerisine yazılmaktadır. Bu nedenle aynı string adı ve id' ler farklı xml dosyalarında kullanılsa bile eşsiz olmalıdır.
Mesela yukarıdaki xml' lere bakarak id' si container olan başka bir component veya adı hello_world olan başka bir string oluşturmamız hatalara neden olacaktır.

Arayüz dosyalarımızı inceledikten sonra gelelim asıl kodlarımızın bulunduğu Java Class'ımıza.
Arayüz dosyalarımızı inceledikten sonra gelelim asıl kodlarımızın bulunduğu Java Class' ımıza.

Classımızı _"src/paket_adi/MainActivity.class"_ dosyasına tıklayarak açıyoruz.

Expand Down Expand Up @@ -232,17 +234,17 @@ Classımızı _"src/paket_adi/MainActivity.class"_ dosyasına tıklayarak açıy
}
```

Kısaca buradaki eklenmiş fonksiyonların ne iş yaptığını anlatmaya çalışacağım. Göründüğü gibi MainActivity class' ımız ActionBarActivity'den extende edilmiştir. Bu Activity'nin biraz
Kısaca buradaki eklenmiş fonksiyonların ne iş yaptığını anlatmaya çalışacağım. Görüldüğü gibi MainActivity class' ımız ActionBarActivity' den extend edilmiştir. Bu Activity' nin biraz
daha özelleştirilmiş halidir. Detaylı bilgi ve diğer classları [buradan](http://developer.android.com/reference/android/app/Activity.html) inceleyebirsiniz.

_**onCreateOptionsMenu()**_ menü itemlerin hangi xml dosyasından alınacağını belirten fonksiyondur. (xml dosya ve componentlerin gen/R.class içerisine derlendiğini söylemiştik.
_**onCreateOptionsMenu()**_ menü item' lerin hangi xml dosyasından alınacağını belirten fonksiyondur. (xml dosya ve componentlerin gen/R.class içerisine derlendiğini söylemiştik.
O yüzden R._tip_._ad_ şeklinde çağrılmaktadır).

_**onOptionsItemSelected()**_ menü içerisinden bir seçeneğe tıklandığı zaman tetiklenecek fonksiyondur. Hangi seçeneğe tıklandığı belirlenip gereken işlemler yaptırılabilir.

Gelelim en önemli fonksiyona

_**onCreate**_ fonksiyonu ise activity çalışırken çalıştırılacak fonksiyondur. Bu fonksiyon activity yaşam döngüsü (Life Cycle) ile ilgilidir. Bunun yanısıra aşağıdaki fonksiyonları da
_**onCreate**_ fonksiyonu ise activity başlarken çalıştırılacak fonksiyondur. Bu fonksiyon activity yaşam döngüsü (Life Cycle) ile ilgilidir. Bunun yanısıra aşağıdaki fonksiyonları da
ekleyip spesifik işlemler için kullanabilirsiniz.

_**onStart ()**_ : Activity, kullanıcıya görünür hale geldiğinde çağrılır.
Expand All @@ -257,13 +259,13 @@ _**onDestroy ()**_ : Acitiviy, sistem tarafından yok edilmeden önce çağrıl

_**onRestart ()**_ : Activity durdurulduğunda ve yeniden başlatıldığında çağrılır.

Bunu da kısaca belirttikten sonra onCreate() fonksiyonunun içeriğini inceleyelim. setContent() fonksiyonu ile kullanacağı layout dosyasını seçtikten sonra supportFragmentManager()
ise fragment yaşam döngüsünü kontrol edebileceğimiz objedir. Transaction başlatıp içerisine add fonksiyonu ile fragment classımız olan PlaceHolder classında tanımlanmış fragmenti çağırmaktadır.
Bu transaction'ı commit() fonksiyonu ile çalıştırabiliriz.
Bunu da kısaca belirttikten sonra onCreate() fonksiyonunun içeriğini inceleyelim. setContentView() fonksiyonu ile kullanacağı layout dosyasını seçilmektedir. Sonrasında getSupportFragmentManager()
ile fragment yaşam döngüsünü kontrol edebileceğimiz obje alınır. Transaction başlatıp içerisine add fonksiyonu ile fragment class' ımız olan PlaceHolder class' ında tanımlanmış fragment' i çağırmaktadır.
Bu transaction' ı, commit() fonksiyonu ile çalıştırabiliriz.

Fragment Class ımız olan _**PlaceholderFragment**_ 'in fonksiyonları da Activity fonksiyonları gibidir. Fragment içerisinde constructordan sonra ilk olarak onCreateView() fonksiyonu
çalıştırılır. Bu fonksiyon içerisinde de fragment layout _**LayoutInflater**_ objesi ile xml dosyamız view nesnesine dönüştürülir ardından ise oluşturulan view Activity'e döndürülür ve
activity bu fragmenti ekrana basar.
Fragment Class' ımız olan _**PlaceholderFragment**_' in fonksiyonları da Activity fonksiyonları gibidir. Fragment içerisinde constructordan sonra ilk olarak onCreateView() fonksiyonu
çalıştırılır. Bu fonksiyon içerisinde de fragment layout _**LayoutInflater**_ objesi ile xml dosyamız view nesnesine dönüştürülir. Ardından ise oluşturulan view Activity'e döndürülür ve
activity, bu fragmenti ekrana basar.

Artık temel yapıyı öğrendiğimize göre uygulamamızı çalıştırabiliriz. :)

Expand Down

0 comments on commit d682105

Please sign in to comment.