Proje Oluşturma

Projemizin ayarlamalarını yapalım.
Proje Ayarları

Projemiz oluştu. Oluşan bu boş projenin dosyalarına bakalım.
Boş Proje Yapısı

Oluşturacağımız projenin EditText, TextView gibi elemanlarının biraz daha güzel görünmesi için drawable klasörüne bir tane shape_kenarlik.xml ekleyip renk, kenarlık gibi değerlerini içerisinde belirtelim.
Drawable Klasörüne Tasarım Nesnesi Ekleyelim

Açılan pencerede şu bilgilerle bir adet shape_kenarlik.xml dosyası oluşturalım.
shape_kenarlik.xml

shape_kenarlik.xml Betikleri
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="#f2f2f2" /> <stroke android:width="1dip" android:color="#FF6200EE"/> </shape>shape_kenarlik.xml Görünüm

Ufak tefek hazırlıkları tamamladık. Sıra geldi ekrandaki öğeleri tasarlamaya. Ekran öğelerimiz şu şekilde olacak
activity_main.xml Betikleri
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:weightSum="5"> <com.google.android.material.textfield.TextInputLayout android:layout_width="0dp" android:layout_height="wrap_content" android:hint="Sayı 1" android:layout_weight="1" android:layout_marginRight="2dp"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/etSayi1" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="numberDecimal" android:background="@drawable/shape_kenarlik" android:gravity="center"/> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:layout_width="0dp" android:layout_height="wrap_content" android:hint="İşlem" android:layout_weight="1" android:layout_marginRight="2dp"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/etIslem" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="1" android:inputType="text" android:background="@drawable/shape_kenarlik" android:gravity="center"/> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:layout_width="0dp" android:layout_height="wrap_content" android:hint="Sayı 2" android:layout_weight="1" android:layout_marginRight="2dp"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/etSayi2" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="numberDecimal" android:background="@drawable/shape_kenarlik" android:gravity="center"/> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginRight="2dp"> <com.google.android.material.textfield.TextInputEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="1" android:inputType="text" android:background="@drawable/shape_kenarlik" android:gravity="center" android:text="=" android:enabled="false"/> </com.google.android.material.textfield.TextInputLayout> <com.google.android.material.textfield.TextInputLayout android:layout_width="0dp" android:layout_height="wrap_content" android:hint="Sonuç" android:layout_weight="1"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/etSonuc" android:layout_width="match_parent" android:layout_height="wrap_content" android:ems="10" android:inputType="text" android:background="@drawable/shape_kenarlik" android:gravity="center" android:enabled="false"/> </com.google.android.material.textfield.TextInputLayout> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp"> <Button android:id="@+id/btnSonuc" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Hesapla"/> </LinearLayout> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>Tasarım Önizleme

Tasarım çalışması bitti. Hesaplamalar için yapılması gereken kodlamaya geçelim. Kodlama kısmındaki işleyiş;
- EditText, Button gibi tasarım nesnelerini global olarak tanımlayacağız.
- findViewById metodu sayesinde tasarım nesnelerini xml içerisinde bulacağız.
- Button setOnClickListener olayı sayesinde btnHesapla adlı butona tıklandığını anlayıp işlemlerimizi başlatacağız.
- getText() metodu ile EditText nesnelerine girilen değerleri alıp bir değişkene aktaracağız.
- Regular Expressions (Düzenli İfadeler) sayesinde girilen bir değerin istediğimiz düzende olup olmadığını kontrol edeceğiz. Örnek olarak girilen bir değerin double olup olmadığını kontrol edeceğiz.
- if koşulu ile gereken şartların sağlanıp sağlanmadığını kontrol edeceğiz. Örnek olarak bir sayının sıfıra bölümünün tanımsız olduğunu bildireceğiz.
- Toast Mesaj sayesinde kullanıcıya uyarı verdireceğiz.
- TextUtils.isEmpty() ile bir değerin var olup olmadığını kontrol edeceğiz.
- switch case yapısı ile çarpma, bölme, çıkarma ve toplama işlemlerinin yapılmasını sağlayacağız.
- setText() metodu ile çıkan sonucu ilgili EditText'e yazdıracağız.
Kısaca işleyiş yapısını sizlere aktarmış olduk. Şimdi uygulama açıldığında çalışan activity olan (MainActivity.java) içerisinde kodlarımızı hazırlayalım.
MainActivity.java
package com.deneme.hesapmakinesi; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends AppCompatActivity { EditText etSayi1, etIslem, etSayi2, etSonuc; Button btnSonuc; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); etSayi1 = (EditText) findViewById(R.id.etSayi1); etIslem = (EditText) findViewById(R.id.etIslem); etSayi2 = (EditText) findViewById(R.id.etSayi2); etSonuc = (EditText) findViewById(R.id.etSonuc); btnSonuc = (Button) findViewById(R.id.btnSonuc); btnSonuc.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String strSayi1 = etSayi1.getText().toString(); String strSayi2 = etSayi2.getText().toString(); String strIslem = etIslem.getText().toString(); etSonuc.setText(""); boolean blnSayi1 = fnDoubleKontrol(strSayi1); boolean blnSayi2 = fnDoubleKontrol(strSayi2); boolean blnIslem = fnIslemKontrol(strIslem); String strUyari = ""; if (!blnSayi1) strUyari = "- Lütfen sayı 1 giriniz.\n"; if (!blnSayi2) strUyari += "- Lütfen sayı 2 giriniz.\n"; if (!blnIslem) strUyari += "- Lütfen '+', '-', '*' veya '/' işlemi giriniz.\n"; else { if (strIslem.equals("/")) { if (strSayi2.contains("0")) strUyari += "- Bir sayının sıfıra bölümü tanımsızdır"; } } if (!TextUtils.isEmpty(strUyari)) Toast.makeText(getApplicationContext(), strUyari, Toast.LENGTH_LONG).show(); else { String strSonuc = ""; switch(strIslem) { case "+": strSonuc = String.valueOf(Double.parseDouble(strSayi1) + Double.parseDouble(strSayi2)); break; case "-": strSonuc = String.valueOf(Double.parseDouble(strSayi1) - Double.parseDouble(strSayi2)); break; case "/": strSonuc = String.valueOf(Double.parseDouble(strSayi1) / Double.parseDouble(strSayi2)); break; case "*": strSonuc = String.valueOf(Double.parseDouble(strSayi1) * Double.parseDouble(strSayi2)); break; default: break; } etSonuc.setText(strSonuc); } } }); } public boolean fnDoubleKontrol(String strDeger) { boolean blnSonuc = false; if (!TextUtils.isEmpty(strDeger)) blnSonuc = strDeger.matches("[0-9]{1,13}(\\.[0-9]*)?"); return blnSonuc; } public boolean fnIslemKontrol(String strDeger) { boolean blnSonuc = false; if (!TextUtils.isEmpty(strDeger)) { if (strDeger.equals("+") || strDeger.equals("-") || strDeger.equals("*") || strDeger.equals("/")) blnSonuc = true; } return blnSonuc; } }
Örnek 1
