22 Şubat 2015 Pazar

İlk Android Uygulamamızı Yapıp Telefonda Çalıştıralım


Bu yazımda android'te basit bir hesap makinesini nasıl yapacağımızı ve yaptığımız bu uygulamayı telefonumuza yükleyip nasıl çalıştıracağımızı anlatacağım. Daha önce hiç denemediyseniz öncelikle geliştirme ortamını bilgisayarınıza kurmalısınız. Bunun için hemen bu adrese girerek Android SDK'i indirin ve Eclipse'sinize entegre edin. Bunun nasıl yapıldığını yazmayacağım (çünkü unuttum ve şimdi hatırlamak için zaman harcamak istemiyorum) ama bu videoyu izleyerek kolayca yapabilirsiniz. Yada bu adresten Android Studio'yu kurarak herhangi bir entegrasyon yapmadan doğrudan uygulama geliştirmeye başlayabilirsiniz. Ama baştan söyleyeyim bu örnek için ben emektar Eclipse'imi kullanacağım. Daha sonraki yazılarımda Android Studio'ya geçersem orada da devam edebilirim.

Başlamadan önce söylemeliyim ki aşağıda yazdığım kodları direk verdim ve yeri geldiğinde bir kaç kısa açıklamada yaptım. Kodlar sizi korkutmasın. Bu bir ders değil o yüzden kodlar üzerinde fazla durmayın. Eğer java'ya aşina değilseniz kodları anlamakta güçlük çekebilirsiniz bu yüzden kodlara çok takılmayın. Burada adım adım bir proje nasıl oluşturulur, test edilir ve telefona yüklenir bunları göreceksiniz. Android programlamayı öğrenmek istiyorsanız java ile başlamanızı tavsiye ederim.

Öyleyse hemem Eclipse'i açıp File>New>Android Application Project diyerek yeni bir proje oluşturalım.


İlk pencerede uygulamanıza bir isim verin. Sonra next diyerek ilerleyin ve son pencerede Finish butonuna tıklayarak projenizi açın.




Sol paneldeki Package Explorer'dan projenizi bulup içersinden
res>layout>activity_main.xml dizininden activity_main_xml dosyasını açın. 


Bu dosya uygulamamızın görsel düzenini tasarlamamızı sağlar. Eclipse penceresi altında Graphical Layout sekmesine geçerseniz bu işi kod yazmadan da yapabilirsiniz. Tek yapmanız gereken soldan kullanmak istediğiniz bileşeni uygulamanızın üstüne taşımak. Çoğu profesyonal programcı activity_main.xml kullanmayı tercih eder ki bizde ilerki derslerde bunu yapacağız. Çünkü xml kodları ile çok daha esnek bir tasarım yapabiliriz. 


Şimdi aşağıdaki basit arayüzü oluşturacağız. Bunun için soldaki paletten 3 tane TextView (Number1, Number2, Result), 3 tane EditText ve 4 tanede Buton (+,-,*,/) ekleyin.


Eklediğiniz bu bileşenleri sağ taraftaki structure menüsünden görebilir ve onları seçerek bir takım özelliklerini aşağıda ayarlayabilirsiniz. Şimdilik sadece TextView'lerin ve Buton'ların text özelliklerini değiştirerek resimdeki haline getirelim.


Eğer kendiniz Graphical Layout ile yapamadıysanız activity_main.xml dosyasını açıp aşağıdaki kodu içerisine kopyalayın. Aynı görünüşü elde edeceksiniz.

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

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="25dp"
        android:layout_marginTop="20dp"
        android:text="Number1 :" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="16dp"
        android:text="Number2 :" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView1"
        android:layout_alignBottom="@+id/textView1"
        android:layout_marginLeft="17dp"
        android:layout_toRightOf="@+id/textView1"
        android:ems="10"
        android:inputType="textPersonName" >

        <requestFocus />
    </EditText>

    <EditText
        android:id="@+id/editText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/editText1"
        android:layout_alignTop="@+id/textView2"
        android:ems="10" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button1"
        android:layout_alignBottom="@+id/button1"
        android:layout_toRightOf="@+id/button1"
        android:text="-" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/textView2"
        android:layout_below="@+id/editText2"
        android:layout_marginTop="27dp"
        android:text="+" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button2"
        android:layout_below="@+id/button2"
        android:layout_marginTop="17dp"
        android:text="*" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/button3"
        android:layout_alignBottom="@+id/button3"
        android:layout_toRightOf="@+id/button3"
        android:text="/" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button1"
        android:layout_below="@+id/button3"
        android:layout_marginTop="24dp"
        android:text="Result : " />

    <EditText
        android:id="@+id/editText3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/textView3"
        android:layout_alignBottom="@+id/textView3"
        android:layout_toRightOf="@+id/textView3"
        android:ems="10" />

</RelativeLayout>

Evet şimdi kod kısmına geçiyorum. Bunun için yine sol panele gidip projeniz içerisinde src>paket isminiz>MainActivity.java dosyasını açalım. Bu uygulamamızın çalıştıracağı java programı olacak. Eğer java'ya aşina değilseniz hazırladığım java derslerini takip edebilirsiniz. 





Kodumuz aşağıdaki gibi. Doğrudan alıp MainActivity.java'nın içerisine yapıştırın.

package com.example.calculator;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

 
Button b1,b2,b3,b4;
EditText tf1,tf2,tf3;
 
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

b1 = (Button) findViewById(R.id.button1);
b2 = (Button) findViewById(R.id.button2);
b3 = (Button) findViewById(R.id.button3);
b4 = (Button) findViewById(R.id.button4);
  
tf1 = (EditText) findViewById(R.id.editText1);
tf2 = (EditText) findViewById(R.id.editText2);
tf3 = (EditText) findViewById(R.id.editText3);
  
b1.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View arg0) {
float sayi1 = Integer.parseInt(tf1.getText().toString());
float sayi2 = Integer.parseInt(tf2.getText().toString());

float sonuc = sayi1 + sayi2;

tf3.setText(Float.toString(sonuc));
}
  
});
  
b2.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View arg0) {
float sayi1 = Integer.parseInt(tf1.getText().toString());
float sayi2 = Integer.parseInt(tf2.getText().toString());

float sonuc = sayi1 - sayi2;

tf3.setText(Float.toString(sonuc));
}
 
 
});


b3.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View arg0) {
float sayi1 = Integer.parseInt(tf1.getText().toString());
float sayi2 = Integer.parseInt(tf2.getText().toString());

float sonuc = sayi1 * sayi2;

tf3.setText(Float.toString(sonuc));
}

 
});
 
 
b4.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View arg0) {
float sayi1 = Integer.parseInt(tf1.getText().toString());
float sayi2 = Integer.parseInt(tf2.getText().toString());

float sonuc = sayi1 / sayi2;

tf3.setText(Float.toString(sonuc));
}
 
 
});    
 
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

}

Şimdi kodumuzu biraz açıklayalım. Öncelikle MainActivity sınıfının içerisinde b1,b2,b3,b4 adında 4 tane buton ve tf1,tf2,tf3 adında 3 tane metin alanı tanımladık. Bunları onCreate metodu içerisinde daha önce activity_main.xml dosyası içerisinde tanımlamış olduğumuz nesnelere atamış olduk. Ondan sonra tek yaptığımız iş OnClickListener sınıfını butonların setOnClickListener metodları içerisinde gerçekleyerek (implementation) her biri için ilgili butona basıldığında ne yapılması gerektiğini yazdık. Buda işlem yapılacak sayıları birinci ve ikinci EditText'lerden getText() metodu ile alarak birinci buton için toplama ikincisi için çıkarma üçüncüsü için çarpma ve dördüncüsü için ise bölme işlemi yapmak. İşlemin sonucunu ise üçüncü EditText'te setText() metodunu kullanarak yazdırdık. Hepsi bu kadar.

Şimdi bir sanal makine oluşturarak programımızı önce bilgisayarda test edelim. Bunun için menüden Android Virtual Device Manager'a tıklayın. 


Açılan pencereden sağ taraftaki New seçeneğini seçerek yeni bir sanal makine oluşturalım.


Sanal makinenize bir isim verin ve aşağıdaki ayarlamaları yaparak OK butonuna tıklayarak bitirin.


Şimdi Run>Run Configurations... seçeneklerine tıklayarak aşağıdaki pencereyi açın. Açılan pencereden Target kısmına geçin soldan projenizi sağdan da oluşturduğunuz SanalMakine'yi seçin ve Run'a tıklayın.





Bilgisayarınız sanal makineyi yüklerken aşağıdaki ekran bilgisayarınızın hızına göre uzun bir süre ekranda kalabilir. Çalışmıyor deyip kapatmayın sabırla bekleyin, açılacaktır.


Uygulamanız çalıştıktan sonra aşağıdaki gibi görünecek.


Bu sanal emülatör modunda farenizi kullanabilirsiniz. Denemek için EditText'lere sayı değerleri girin ve istediğiniz işlem butonuna basın. Sonucun alttaki EditText'te çıktığını göreceksiniz.

Şimdi hazırladığımız bu uygulamayı telefonumuza yükleyelim. Bunu için sol panelden bin>res>Calculator.apk (kendi projeniz için bu isim farklı olabilir) dosyasını bulun  ve telefonunuza atın.



Bu uygulamayı yükleyebilmek için telefonunuzun güvenlik ayarlarından kaynağı belli olmayan uygulamaların yüklenmesi seçeneğini aktifleştirin. Bundan sonra uygulamanızı telefonunuza yükleyin ve çalıştırın.


İşte ilk android uygulamamızı yazıp, test edip, telefonumuzda çalıştırmış olduk. Umarım sizler için faydalı olmuştur. Sonraki yazımda görüşmek üzere.

Esen kalın.

@Emin_Ucer



Hadi Java Öğrenelim - Constructors (Yapıcı Metodlar)

Constructors yani "yapıcılar" javada nesneleri ilklendirmek(initialize) için kullanılan özel metotlardır. Nesne oluşturulma aşamasında çağrılırlar ve nesne için gerekli olan ilk ayarlama gibi işlemlerin yapılmasına imkan verirler.

Javada constructor oluşturmanın 2 kuralı vardır.

- Constructor ismi sınıf ismi ile aynı olmalıdır.
- Constructorlar açık şekilde tanımlı bir değer tipi döndürmezler.

Daha önceki destede belirttiğim gibi 2 türde olabilirler.

- Parametre almayan default-constructor
- Parametre alan constructor

Eğer bir formül isterseniz;

Default Constructor     : <sınıf_adı>(){}
Parametreli Constructor : <sınıf_adı>(parametreler){}

Eğer siz herhangi bir constructor tanımlamazsanız derleyici sizin yerinize boş bir default constructor tanımlayacaktır.

Aşağıdaki örnekte Araba1 sınıfının Araba1() adında bir default constructor'ı var. Yaptığı şey ise sadece ekrana "Araba Olusturuldu" yazmak. Nitekim daha önceki derste yaptığımız gibi bir main() metodu içerisine bu sınıfın bir nesnesini sadece aşağıdaki gibi tanımlayıp programı çalıştırırsak, nesnenin oluşturulma aşamasında constructor çağrılacağından ekrana "Araba Olusturuldu" yazılacaktır.

class Araba1{
Araba1() { System.out.println("Araba Olusturuldu"); }
public static void main(String args[]){
Araba1 a = new Araba1();
}
}

Program Çıktısı:

Araba Olusturuldu


Bir önceki yazımda parametre alan constructor'ı göstermiştim. Yukarıda da zaten formülize ettim. Aşağıdaki örneği inceleyip anlamaya çalışalım.


class Ogrenci{
String isim;
int numara;

Ogrenci(String ogrenciAdi, int ogrenciNumarasi){
isim = ogrenciAdi;
numara = ogrenciNumarasi;
}

void goster(){  System.out.println(numara + " " + isim); }

public static void main(String args[]){
Ogrenci s = new Ogrenci("Sherlock",221);
Ogrenci w = new Ogrenci("Watson",122);
s.goster();
w.goster();
}
}

Program Çıktısı:

221 Sherlock
122 Watson


Ogrenci sınıfının constructor'ı aldığı iki parametreyi (ogrenciAdi, ogrenciNumarasi) sınıfın isim ve numara değişkenlerine atayacaktır. goster() metodu sadece ekrana numara ve isim değerlerini aralarında bir boşluk bırakarak yazdırır. main() metoduna bakarsak nesneleri oluşturma aşamasında constructor'a parametre değerlerini ("Sherlock",221 ve "Watson",122)  verdik. Sonraki satırda ise bu sınıfın goster() metodu ile ekrana bu değerleri yazdırmış olduk. Program çıktısı verildiği gibi olacaktır.

[ Üzerinde durmaya gerek yok ama yeri geçti belirteyim. Sınıfın bir üyesine (değişken veya metod) ulaşmak için nesne isminden sonra "." koyuyoruz, s.goster() gibi. ]

Yine bir önceki ders belirttiğim gibi bir sınıfın birden fazla constructor'ı olabilir. Nasıl olur ? Eğer farklı parametrelere sahipse olur. Siz nesne oluşturma aşamasında ne tür parametre kullanıyorsanız ilgili constuctor otomatik olarak çağrılacaktır.


class Ogrenci{
int numara = 0;
String isim = "???";

Ogrenci(){}
Ogrenci(int ogrenciNumarasi){ numara = ogrenciNumarasi; }
Ogrenci(String ogrenciAdi){ isim = ogrenciAdi; }
Ogrenci(String ogrenciAdi, int ogrenciNumarasi){
isim = ogrenciAdi;
numara = ogrenciNumarasi;
}

void goster(){  System.out.println(numara + " " + isim); }

public static void main(String args[]){
Ogrenci a = new Ogrenci();
Ogrenci b = new Ogrenci(333);
Ogrenci c = new Ogrenci("Jill");
Ogrenci d = new Ogrenci("Superman",444);

a.goster();
b.goster();
c.goster();
d.goster();

}
}

Program Çıktısı:

0 ???
333 ???
0 Jill
444 Superman



Görüldüğü gibi bu örnekte tam 4 tane  cosntructor var. İlki boş bir dafault constuctor, herhangi bir işlem yapmıyor. Dolayısıyla bu constructor ile oluşturulan a nesnesinin çıktısı başlangıçta tanımlanmış numara = 0 ve isim = "???" değerlerini veriyor. İkincisi sadece ogrenciNumarasi diye bir parametreli bir constructor. Yaptığı iş aldığı değeri numara değişkenine atamak, isim değişkenine herhangi bir değişiklik yapmıyor. Dolayısıyla bu constructor ile oluşturulan b nesnesinin çıktısı "333 ???" şeklinde. Üçüncü cosntuctor da ikinciye benzer, bu sefer sadece isim değişkenini aldığı parametre ile değiştiriyor, haliyle çıktısı "0 Jill". Son constuctor iki parametre alarak iki değişkeninde değiştiriyor, bunun çıktısı ise görüldüğü gibi "444 Superman".

Örnekten de anlaşıldığı üzere aldığı parametreleri değiştirerek istediğimiz kadar constructor yazabilirsiniz.

Bir sonraki yazıda görüşmek üzere
İyi çalışmlar

@Emin_Ucer

10 Şubat 2015 Salı

Bir bilgisayarda 2 lokal sunucu çalıştırmak

Web uygulamalarımızı deneyebilmek için bilgisayarımıza geliştirdiğimiz platformu destekleyen sunucular kuruyoruz. Asp için Windows ile birlikte gelen IIS veya Php için XAMPP gibi. Ama bazen uygulama geliştirirken yerine göre Asp veya Php de kod yazıp denemeniz gerekiyor (en azından bana lazım oldu şimdi). Bu durumda bilgisayarınızda iki farklı servis sağlayıcının da kurulu olması gerekir. Peki hazırladığımız asp veya php sayfalarını diğer sunucuyu kaldırmadan nasıl çalıştıracağız ?

Biraz araştırdıktan sonra gördüm ki sunucuların kullandıkları portları değiştirmek yeterli oluyor bunun için. Genelde varsayılan olarak 80 portunu kullanıyorlar. Bunu değiştirmek için aşağıdaki adımları takip edin.

IIS için

Denetim Masası > Yönetimsel Araçlar > IIS (Internet Information Services)


Soldan "Default Web Site" seçtikten sonra sağdan da "Siteyi Düzenle" altındaki "Bağlamalar..." 'a tıklayın. 


Burada listede görünen bağlamaya tıklayıp düzenle deyin.


Gelen pencerede "Bağlantı Noktası" sunucunuzun kullandığı port oluyor. Bunu başka bir port numarasıyla değiştirebilirsiniz. Değişiklikten sonra "Tamam" demeyi unutmayın.

Bu değişiklikten sonra lokal sunucunuza ulaşmak için tarayıcıcınızın adres satırına artık atadığınız port numarasınıda ":" ifadesinden sonra girmelisiniz. Bu örnek için "localhost:83". Diğer sunucuya da eğer default ise direk "localhost" diyerek bağlanabilirsiniz.



XAMPP için

Eğer ilk olarak IIS kurduysanız, XAMPP'i kurduğunuzda Apache sunucusu aynı portu kullanmaya çalışacağından çakışıp başlamayacaktır. Bunu önlemenin yolu Apache sunucusunun kullandığı portu değiştirmektir. Bunun için XAMPP kontrol panelinden Apache için Config butonuna tıklayarak açılan menüden "Apache (httpd.conf)" seçeneğine tıklayın.


Açılan not defterinden "Listen 80" ifadesini bulup istediğiniz port değeriyle değiştirin (bu örnek için 31. portu seçtim). Daha sonra yine aynı not defterinden "ServerName localhost" ifadesininde bulup son kısmına belirlemiş olduğunuz port numarasını önüne ":" koyarak aşağıdaki gibi yazıp kaydedin. Şimdi Apache'yi Control Panel'den çalıştırabilirsiniz. 


Bu sunucuya ulaşmak için ise öncekinde olduğu gibi adres satırına "localhost:31" yazmanız yeterli olacaktır.


Görüldüğü gibi bilgisayarınızda iki farklı sunucuyu onlara farklı port değerleri vererek çalıştırabilirsiniz. Benim işime yaradığı ve çözümünü bulduğum için paylaşayım dedim. Eminin zaten çoğunuz biliyordur bunu ama bilmeyenler veya unutanlar için bir kenarda bulunsun.

Hepinize Kolay Gelsin!!!

@Emin_Ucer