Android Studio veya herhangi bir editör ile Android ortamında çalışacak bir hesap makinesi yapabilmek için öncelikle tasarımı ortaya çıkarıyoruz. Bu örnekte her bir sayı için bir buton oluşturmak yerine sayıların girilebileceği Number tipinde bir EditText nesnesi oluşturularak seçilen işleme göre sonuçların kaydedildiği bir hesap makinesinin nasıl gerçekleştirildiği gösterilecektir.
Hesap makinemizin activity_main.xml dosyasına bakıldığında görüntüsü aşağıdaki şekilde olmaktadır. Bu görüntüyü oluşturabilmek için yatay ve dikey konumlu LinearLayout düzeni seçilmiştir. İlk sayı girildikten sonra işlem seçilecek, ardından ikinci sayı girilecek ve eşittir butonuna basıldığında işlem geçmişe eklenerek gösterilecektir. Ardından oluşturulan bu sonuç, istenirse yeni bir sayı girilmeden bir sonraki işlemin ilk sayısı olarak kabul edilecektir.
Uygulama üzerinde işlemler gerçekleştirildiğinde Android hesap makinesinin ekran görüntüsü aşağıdaki şekilde görülecektir:
Bu hesap makinesi görünümünü oluşturmak için android_main.xml dosyası kodları şu şekilde olmalıdır:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout 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"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/etGiris" android:layout_width="match_parent" android:layout_height="48dp" android:background="@android:color/holo_orange_light" android:ems="10" android:gravity="end" android:hint="Sayı Giriniz" android:inputType="number" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btTopla" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="2dp" android:layout_weight="1" android:background="@android:color/holo_blue_bright" android:text="+" /> <Button android:id="@+id/btCikar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="2dp" android:layout_weight="1" android:background="@android:color/holo_blue_bright" android:text="-" /> <Button android:id="@+id/btCarp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="2dp" android:layout_weight="1" android:background="@android:color/holo_blue_bright" android:text="x" /> <Button android:id="@+id/btBol" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="2dp" android:layout_weight="1" android:background="@android:color/holo_blue_bright" android:text="/" /> </LinearLayout> <Button android:id="@+id/btEsit" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="2dp" android:background="@android:color/holo_blue_bright" android:text="=" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <EditText android:id="@+id/etGecmis" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@android:color/darker_gray" android:ems="10" android:gravity="top" android:hint="İşlem Geçmişi" android:inputType="textMultiLine" /> <Button android:id="@+id/btTemizle" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="1" android:background="@android:color/holo_green_dark" android:text="T\nE\nM\nİ\nZ\nL\nE" /> </LinearLayout> </LinearLayout> </android.support.constraint.ConstraintLayout> |
Öncelikle Java kodları ile aktivite üzerinde oluşturulan nesnelere erişebilmek için bu nesnelerin kod yardımıyla tespit edilip Java’da kendi oluşturduğumuz bir nesneye aktarımlarının yapılması gerekmektedir. findViewById metodu yardımıyla, aktivite üzerindeki nesneler bulunarak uygun tipte değişkenlere aktarılır. Varsayılan değerlerin kullanılmasıyla oluşturulan projede MainActivity.java dosyasına aşağıdaki kodlar yazılır:
1 2 3 4 5 6 7 8 | final Button esit = findViewById(R.id.btEsit); final Button topla = findViewById(R.id.btTopla); final Button cikar = findViewById(R.id.btCikar); final Button carp = findViewById(R.id.btCarp); final Button bol = findViewById(R.id.btBol); final Button temizle = findViewById(R.id.btTemizle); final TextView giris = (TextView) findViewById(R.id.etGiris); final EditText gecmis = findViewById(R.id.etGecmis); |
Böylece oluşturulan her bir nesneye esit, topla, cikar gibi değişkenler yardımıyla erişim mümkün olacaktır. final ifadesi, oluşturulan nesnelerin nihai halde olduklarının derleyeciye bildirilmesi gibi bir görevi vardır. Burada kullanılan bazı anonim metodlar ile ileride oluşturulabilecek kendi metodlarımızın bu nesnelere erişimde sorun oluşturmasını engellemek için bu ifade kullanılmaktadır.
Nesneleri elde ettikten sonra toplama, çarpma, çıkarma ve bölme işlemleri için gerçekleştirilmesi gereken komutları yazmalıyız. Bir botuna basılıp basılmadığını anlamak amacıyla ilgili buton için “Listener” tanımlanması gerekmektedir. Oluşturulan her bir Listener, program açık olduğu sürece kullanıcı tarafından belirtilen tipte bir hareketin (butona basma, uzun basma, sağa kaydırma vb.) kullanıcı tarafından yapılıp yapılmadığını sürekli kontrol eder. Toplama işlemi için oluşturulması gereken onClickListener şu şekildedir:
1 2 3 4 5 6 7 8 | topla.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sayi1 = Double.parseDouble(giris.getText().toString()); islem="+"; giris.setText(""); } }); |
Girilen metnin Double tipte bir değişkenin işleyebileceği türe dönüştürmek için Double.parseDouble() metodu kullanılır. Ayrıca seçilen işlemin ne olduğunun, sonuç butonuna basıldığında anlaşılabilmesi için islem adındaki bir değişkende gerçekleştirilmesi gereken işlem de “+”, “-“, “*” veya “/” şeklinde tutulacaktır.
Çıkarma, çarpme ve bölme butonları için yazılması gereken kodlar da toplama butonuna benzer şekildedir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | cikar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sayi1 = Double.parseDouble(giris.getText().toString()); islem="-"; giris.setText(""); } }); carp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sayi1 = Double.parseDouble(giris.getText().toString()); islem="x"; giris.setText(""); } }); bol.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sayi1 = Double.parseDouble(giris.getText().toString()); islem="/"; giris.setText(""); } }); |
İlk sayı girilip işlemin seçilmesiyle ikinci sayı girişi yapılacaktır. Eşittir butonuna basıldığında, seçilen işleme göre işlem gerçekleştirilip geçmiş bölmesinde bu işlemler listelenecektir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | esit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sayi2 = Integer.parseInt(giris.getText().toString()); switch (islem) { case "+": sonuc=sayi1+sayi2; break; case "-": sonuc=sayi1-sayi2; break; case "x": sonuc=sayi1*sayi2; break; case "/": sonuc=sayi1/sayi2; break; } giris.setText(""+sonuc); gecmis.setText(sayi1+" "+islem+" "+sayi2+" = "+sonuc+"\n"+gecmis.getText().toString()); } }); |
Geçmiş panelinin temizlenmesi gerektiğinde TEMİZLE butonu kullanılacaktır. Butona basıldığında aşağıdaki kodlar çalışır:
1 2 3 4 5 6 | temizle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { gecmis.setText(""); } }); |
MainActivity.java dosyasının tamamlanmış hali aşağıdaki şekilde olacaktır:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | package com.teknikakil.hesapmakinesi; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends AppCompatActivity { double sayi1,sayi2; double sonuc; String islem=""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final Button esit = findViewById(R.id.btEsit); final Button topla = findViewById(R.id.btTopla); final Button cikar = findViewById(R.id.btCikar); final Button carp = findViewById(R.id.btCarp); final Button bol = findViewById(R.id.btBol); final Button temizle = findViewById(R.id.btTemizle); final TextView giris = (TextView) findViewById(R.id.etGiris); final EditText gecmis = findViewById(R.id.etGecmis); topla.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sayi1 = Double.parseDouble(giris.getText().toString()); islem="+"; giris.setText(""); } }); cikar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sayi1 = Double.parseDouble(giris.getText().toString()); islem="-"; giris.setText(""); } }); carp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sayi1 = Double.parseDouble(giris.getText().toString()); islem="x"; giris.setText(""); } }); bol.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sayi1 = Double.parseDouble(giris.getText().toString()); islem="/"; giris.setText(""); } }); esit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sayi2 = Integer.parseInt(giris.getText().toString()); switch (islem) { case "+": sonuc=sayi1+sayi2; break; case "-": sonuc=sayi1-sayi2; break; case "x": sonuc=sayi1*sayi2; break; case "/": sonuc=sayi1/sayi2; break; } giris.setText(""+sonuc); gecmis.setText(sayi1+" "+islem+" "+sayi2+" = "+sonuc+"\n"+gecmis.getText().toString()); } }); temizle.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { gecmis.setText(""); } }); } } |