Ders 11: Android Hesap Makinesi Uygulaması

28 Ocak 2012 Cumartesi
Hem ara yüzün oluşturulmasında hem de listener yapısının tam olarak anlaşılmasında faydalı olacak bir örnek.

·         Main.xml içerisine geliyoruz ve öncelikli olarak containerımızı oluşturuyoruz.Bu örneğimizde, tüm componentlerin yerlerini spesefik olarak belirli alanlara koymak istiyoruz.Bu neden AbsoluteLayout kullanıyoruz.


<AbsoluteLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">

Orientation değerine “vertical” vererek, koyacağımız componentlerin dikey olarak yerleştirileceğini yani alt alta geleceklerini belirtiyoruz. Layout_width ve layout_height değerlerinin” fill_parent” olması, containerın tüm ekranı kaplayacağı anlamına geliyor.

·         İşlemlerin gözükeceği ekranı koyuyoruz. Bu ekran, bir EditText. Dolayısı ile bir EditText oluşturuyoruz:


<EditText
android:id="@+id/islemekran"
android:layout_y="9dp"
android:layout_x="0dp"
       android:layout_width="match_parent"
android:layout_height="wrap_content" />

Burada componentimize bir ID veriyoruz. Böylece bu componente, java dökümanı içinden ulaşma şansımız olacak. Layout_x ve layout_y değerlerini belirterek, componentin spesifik yerini gösteriyoruz.

·         Sıra geldi, numara butonlarını yapmaya:



<Button
       android:text="1"
        android:id="@+id/no1"
        android:layout_width="62dp"
        android:layout_height="wrap_content"
        android:layout_x="26dp"
        android:layout_y="54dp" />
     
<Button
        android:text="2"
        android:id="@+id/no2"
        android:layout_width="62dp"
        android:layout_height="wrap_content"
        android:layout_x="132dp"
        android:layout_y="54dp" />
    <Button
        android:text="3"
        android:id="@+id/no3"
        android:layout_width="62dp"
        android:layout_height="wrap_content"
       android:layout_x="236dp"
        android:layout_y="54dp" />
  
<Button
        android:text="4"
        android:id="@+id/no4"
        android:layout_width="62dp"
       android:layout_height="wrap_content"
        android:layout_x="26dp"
        android:layout_y="106dp" />
    <Button
        android:text="5"
        android:id="@+id/no5"
       android:layout_width="62dp"
        android:layout_height="wrap_content"
        android:layout_x="132dp"
        android:layout_y="106dp" />
   
<Button
        android:text="6"
        android:id="@+id/no6"
        android:layout_width="62dp"
        android:layout_height="wrap_content"
        android:layout_x="236dp"
        android:layout_y="106dp"/>
      <Button
        android:text="7"
        android:id="@+id/no7"
       android:layout_width="62dp"
        android:layout_height="wrap_content"
        android:layout_x="26dp"
        android:layout_y="162dp"/>
     <Button
        android:text="8"
        android:id="@+id/no8"
        android:layout_width="62dp"
        android:layout_height="wrap_content"
        android:layout_x="132dp"
        android:layout_y="162dp"/>
  
<Button
        android:text="9"
        android:id="@+id/no9"
        android:layout_width="62dp"
        android:layout_height="wrap_content"
        android:layout_x="236dp"
        android:layout_y="162dp" />
     <Button
        android:text="0"
        android:id="@+id/no0"
        android:layout_width="62dp"
       android:layout_height="wrap_content"
        android:layout_x="236dp"
        android:layout_y="218dp" />

Burada önemli olan tek şey yerleri düzgün bir biçimde spesifik olarak belirleyebilmek. Yoksa verilen diğer tüm özellikler gayet basit.

·         Sayı butonlarını yaptıktan sonra işlem yapıcak butonları da tanımlıyoruz:


<Button
        android:text="="
        android:id="@+id/esittir"
        android:layout_width="62dp"
        android:layout_height="wrap_content"
        android:layout_x="236dp"
        android:layout_y="274dp" />           
    <Button
        android:text="/"
        android:id="@+id/bolu"
        android:layout_width="62dp"
        android:layout_height="wrap_content"
        android:layout_x="132dp"
        android:layout_y="274dp" />
  
<Button
        android:text="X"
        android:id="@+id/carpi"
        android:layout_width="62dp"
        android:layout_height="wrap_content"
        android:layout_x="26dp"
        android:layout_y="274dp" />
    <Button
        android:text="+"
        android:id="@+id/arti"
        android:layout_width="62dp"
       android:layout_height="wrap_content"
        android:layout_x="26dp"
        android:layout_y="218dp" />
    <Button
        android:text="-"
        android:id="@+id/eksi"
        android:layout_width="62dp"
       android:layout_height="wrap_content"
        android:layout_x="132dp"
        android:layout_y="218dp" />
    <Button
       android:text="Sıfırla"
       android:id="@+id/sifirla"
       android:layout_width="167dp"
       android:layout_height="wrap_content"
       android:layout_x="25dp"
      android:layout_y="330dp" />
    <Button
        android:text="Sil"
        android:id="@+id/teksil"
        android:layout_height="wrap_content"
        android:layout_x="236dp"
        android:layout_y="330dp"
        android:layout_width="62dp" />

Aynı şekilde burada da önemli olan yerleri belirleyebilmek. Bu herkesin isteğine kalmış bir şey. İsteyen istediği butonu istediği yere koyabilir.

·         Tasarım işlemini bitirmek için containerımızı kapatmayı unutmuyoruz:


</AbsoluteLayout>

·         Tasarım işlemi bitti. Geriye kaldı, butonlara işlevleri yüklemek. Bunun için activity dosyamıza yani src içindeki java dökümanımıza gidiyoruz. Öncelikli olarak, Button ve Edittext gibi componentler kullandığımız için import yapmamız gerekiyor:


import android.view.View;
import android.widget.Button;
import android.widget.EditText;


·         Ardından butonlarımıza ve edittextimize java dökümanı içinden erişmemiz gerekiyor. Öncelikli olarak componentlere erişmek için değişkenlerimizi yaratıyoruz:


Button no1;
       Button no2;
       Button no3;
       Button no4;
       Button no5;
       Button no6;
       Button no7;
       Button no8;
       Button no9;
       Button no0;
       Button arti;
       Button eksi;
       Button carpi;
       Button bolu;
       Button sil;
       Button sifirla;
       Button esittir;
       EditText islemekrani;

Bu tanımlamaları Avticity sınıfının içinde ancak onCreate metoduna girmeden önce yapıyoruz. OnCreate metodu içinde ise main.xml içerisindeki componentlere erişme işini findViewById(…) metodu ile gerçekleştiriyoruz:

        no1 = (Button)findViewById(R.id.no1);
        no2 = (Button)findViewById(R.id.no2);
        no3 = (Button)findViewById(R.id.no3);
        no4 = (Button)findViewById(R.id.no4);
        no5 = (Button)findViewById(R.id.no5);
        no6 = (Button)findViewById(R.id.no6);
        no7 = (Button)findViewById(R.id.no7);
        no8 = (Button)findViewById(R.id.no8);
        no9 = (Button)findViewById(R.id.no9);
        no0 = (Button)findViewById(R.id.no0);
        arti = (Button)findViewById(R.id.arti);
        eksi = (Button)findViewById(R.id.eksi);
        carpi = (Button)findViewById(R.id.carpi);
        bolu = (Button)findViewById(R.id.bolu);
        sil = (Button)findViewById(R.id.teksil);
        esittir = (Button)findViewById(R.id.esittir);
        sifirla = (Button)findViewById(R.id.sifirla);
        islemekrani = (EditText)findViewById(R.id.islemekran);
·         Şimdi sıra geldi dinleyici sınıfı implement edip, bunu ulaştığımız componentlerin üzerine yerleştirmeye. İlk olarak implement işlemini gerçekleştirelim ve Activity classımıza şu kodu ekleyelim:

implements OnClickListener 

·         Yani sonuçta Activity classımız şu şekilde gözükecek:

public class HesapMakinesiActivity extends Activity implements OnClickListener {

·         Implement işleminin ardından, componentlerimiz üzerine dinleyici sınıfı yerleştirelim:


no1.setOnClickListener(this);       
no2.setOnClickListener(this);      
no3.setOnClickListener(this);      
no4.setOnClickListener(this);       
no5.setOnClickListener(this);       
no6.setOnClickListener(this);       
no7.setOnClickListener(this);      
no8.setOnClickListener(this);       
no9.setOnClickListener(this);      
no0.setOnClickListener(this);       
arti.setOnClickListener(this);       
eksi.setOnClickListener(this);      
carpi.setOnClickListener(this);      
bolu.setOnClickListener(this);      
sil.setOnClickListener(this);       
esittir.setOnClickListener(this);
sifirla.setOnClickListener(this);

·         Listener sınıfına ait olan onClick(..) metodunu tanımlayalım ve öncelikli olarak sayısal tuşların nasıl çalışacağını belirleyelim:


@Override
       public void onClick(View arg0) {
             // TODO Auto-generated method stub
             if(arg0.equals(no1))
             {
                    islemekrani.setText(islemekrani.getText() + "1");
             }
             else if(arg0.equals(no2))
             {
                    islemekrani.setText(islemekrani.getText() + "2");          
             }          
             else if(arg0.equals(no3))
             {
                    islemekrani.setText(islemekrani.getText() + "3");          
             }
           
             else if(arg0.equals(no4))
             {
                  islemekrani.setText(islemekrani.getText() + "4");          
             }
            
             else if(arg0.equals(no5))
             {
                    islemekrani.setText(islemekrani.getText() + "5");          
             }           
             else if(arg0.equals(no6))
             {
                    islemekrani.setText(islemekrani.getText() + "6");          
             }
       
             else if(arg0.equals(no7))
             {
                    islemekrani.setText(islemekrani.getText() + "7");          
            }
             else if(arg0.equals(no8))
             {
                   islemekrani.setText(islemekrani.getText() + "8");          
            }
             else if(arg0.equals(no9))
             {
                    islemekrani.setText(islemekrani.getText() + "9");          
             }
             else if(arg0.equals(no0))
             {
                    islemekrani.setText(islemekrani.getText() + "0");          
             }

·         Sayısal ifadelerin işlevinin belirlenmesinden sonra, matematiksel işlemleri nasıl gerçekleştireceğimizi belirleyelim:

·         Yapılacak işlemler 2 sayı arasında gerçekleşeceği için bu sayıları EditTextimizden alıp bir değişken de tutmamız ve yapılacak işlemi belirlememiz gerekiyor. Bunun için EditText ve Button değişkenlerimizi tanımladığımız kısma geri dönüyoruz ve yeni tanımlamalarımızı ekliyoruz:


double sayi1=0 ;
      double sayi2=0;
      double sonuc=0;
   String islem;

·         Bunun ardından onClick(..) metodumuza geri dönelim ve kaldığımız yerden devam edelim:




else if(arg0.equals(arti))
             {
 if(!(islemekrani.getText().toString().equals("")))
           {sayi1=Double.parseDouble(islemekrani.getText().toString());
                    islemekrani.setText("");
                    islem = "+";        }
             }
             else if(arg0.equals(eksi))
             {
if(!(islemekrani.getText().toString().equals("")))
          {sayi1=Double.parseDouble(islemekrani.getText().toString());
                    islemekrani.setText("");
                    islem = "-";}
                             }
             else if(arg0.equals(carpi))
             {
if(!(islemekrani.getText().toString().equals("")))
           {sayi1=Double.parseDouble(islemekrani.getText().toString());
                    islemekrani.setText("");
                    islem = "*";}                   
             }
             else if(arg0.equals(bolu))
             {
if(!(islemekrani.getText().toString().equals("")))
          {sayi1=Double.parseDouble(islemekrani.getText().toString());
                    islemekrani.setText("");
                    islem = "/";}
                   
             }

Burada kodumuzun yaptığı şey, işlemi bir stringte tutmak, EditTextimizi ( yani islemekrani) temizlemek ve o sırada EditText içerisinde yazılı olan sayıyı tutmak.Tabi bu işlemleri yapmadan önce de EditText boş mu dolu mu diye kontrol etmek gerekiyor.Eğer EditText boş ise yapacak bir işlem olmadığından, bizim de bu işlemleri yapmamıza gerek yok.

·         Şimdi ise sil (tek bir sayıyı silmeye yarıyor) ve sıfırla butonlarımızın işlevlerini belirleyelim:



else if(arg0.equals(sifirla))
             {
                    islemekrani.setText("");
                    islem="";
                    sayi1=0;
                   sayi2=0;                   
             }

Sıfırla işlemi demek, her şeyi sıfırla, tüm değişkenleri ilk haline getir ve EditTexti boşalt anlamına geldiğinden kodumuzda da bunu uyguluyoruz.



else if(arg0.equals(sil))
             {
                   
                    if(!(islemekrani.getText().toString().equals("")))   
                      {   
                     String kopyaekran = islemekrani.getText().toString();
                     kopyaekran=kopyaekran.substring(0,kopyaekran.length()-1);
                      islemekrani.setText(kopyaekran);            
                    }
                    else
                    {
                           islem="";
              }
                  
             }

Sil işleminde de yine EditTextimizin boş olup olmadığı önemli. Bunu kontrol ettikten sonra, eğer ekranda yazılı bir şeyler varsa; yazılmış bilgiyi bir değişkende tutuyor, içinden son karakterini çıkartıyor(subString metodu ile) ve bu yeni halini ekranda gösteriyoruz. Ancak ekran boş ise sadece işlem stringimizi boşaltıyoruz.

·         Son olarak = ifadesinin nasıl çalışacağını belirleyelim:


else
             {
        sayi2=Double.parseDouble((islemekrani.getText().toString()));
                                if(islem.equals("+"))
                                    {
                                        sonuc = sayi1+sayi2;
                                        sayi1=0;
                                        sayi2=0;
                                    }else if(islem.equals("-"))
                                    {
                                        sonuc = sayi1-sayi2;
                                        sayi1=0;
                                        sayi2=0;
                                    }else if(islem.equals("*"))
                                    {
                                        sonuc = sayi1*sayi2;
                                        sayi1=0;
                                        sayi2=0;
                                    }
                                    else if(islem.equals("/"))
                                    {
                                        sonuc = sayi1/sayi2;
                                        sayi1=0;
                                        sayi2=0;
                                    }
                        islemekrani.setText(Double.toString(sonuc));           
             }


Burda da yaptığımız şey ekranda o anda bulunan sayıyı alıp 2.sayımız olarak belirlemek, işlemi belirleyip onu uygulatmak ve çıkan sonucu EditText üzerinde göstermek.

Uygulamanın görüntüsü ise şöyle oluyor:


5 yorum:

  1. Homeless dedi ki...:

    Bu kodda bana anlatman gereken yerler var...

  1. 3k dedi ki...:

    mesela?

  1. Homeless dedi ki...:

    Yok burdan olmaz gözlerime bakarak anlatmalısın...

  1. erkndmrl dedi ki...:


    no1.setOnClickListener(this);

    no2.setOnClickListener(this);


    bu kısımları nereye ekliyoruz?

  1. 3k dedi ki...:

    src içindeki activity dosyanız içinde,
    Buton tanımlamalarını yaptıktan sonra, yani
    Button no1;
    Button no2;

    şeklinde yazdıktan sonra, sınıfınıza listener implement ederek,
    public class HesapMakinesiActivity extends Activity implements OnClickListener

    bu tanımlamaların hemen altına yazabilirsiniz.

Yorum Gönder