Android uygulama geliştirmeye merak salanlar nedendir bilinmez genellikle ilk olarak bir hesap makinesi uygulaması oluşturmaya çalışırlar. Örnek bir uygulama görerek uygulama geliştirmek bence daha kolaydır. Bu sebeple basit bir hesap makinesi örneği oluşturup bunu blog sitemde yayınlamaya karar verdim.
Android Studio uygulaması kullanarak, ConstraintLayout üzerinden tasarım yaparak ilerleyeceğiz. Adım adım işlemleri takip ederek uygulamayı oluşturmuş olacaksınız,

Android Studio açtıktan sonra yeni proje oluştur dedikten sonra Şekil-1’deki ekrana ulaşacaksınız. Buradan Empty Activity seçeneği ile seçip devam edebilirsiniz.

Empty Activity seçeneğini seçip devam ettikten sonra karşımıza Şekil-2’deki yapılandırma penceresi açılacaktır. Burada Name kısmına projemizin ismini Package name kısmına ise com.yapimciKisiveyaFirma.ProjeIsmi şeklinde giriş yapıyoruz. Daha sonra neden bu şekilde giriş yapıldığını fırsat bulursam anlatacağım ancak temelde projemizi Google PlayStore’da yayınlarken kullanacağımızı bilmeniz yeterlidir.

Yapılandırma kısmını geçip ilerledikten sonra karşımıza boş bir proje çıkmaktadır. Basit bir hesap makinası uygulaması yapacağız ve şu an için bizim ilgilenmemiz gereken kısımlar java içerisindeki MainActivity dosyası ve res içinde layaut içerisindeki activity_main.xml dosyasıdır. Bu dosyalar otomatik bir şekilde oluşturuldu. Şekil-3’de MainActivity içerisindeki java kodlarını görüyoruz.

Uygulamamızın tasarım kısını görsel olarak Şekil-4’deki gibi activity_main.xml dosyası üzerinden yapıyoruz. Sol tarafta gördüğümüz tool palet üzerinden çek bırak ile tasarım yapabildiğimiz gibi bunu yine kodlar ile de yapabiliriz.

Ekrana eklenen TextView ögesinin kodları aşağıdaki gibidir. Bizde hesap makinası uygulamasına butonlar ve textView ekleyerek bir şekil ortaya çıkaracağız. Bu kodlar aşağıdaki gibi olacaktır.
<?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"
android:background="@android:color/background_dark"
tools:context=".MainActivity">
<Button
android:id="@+id/btn0"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:layout_marginBottom="5dp"
android:background="?attr/colorButtonNormal"
android:text="0"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/btn3"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn2"
app:layout_constraintVertical_bias="0"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btnVirgul"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="5dp"
android:background="?attr/colorButtonNormal"
android:text=","
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btnEsittir"
app:layout_constraintStart_toEndOf="@id/btn2"
app:layout_constraintTop_toBottomOf="@+id/btn3"
app:layout_constraintVertical_bias="0.0"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btnEsittir"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="5dp"
android:background="@android:color/holo_orange_dark"
android:text="="
android:textColor="@android:color/background_light"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/btn3"
app:layout_constraintTop_toBottomOf="@+id/btnTopla"
app:layout_constraintVertical_bias="0.0"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btn1"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:background="?attr/colorBackgroundFloating"
android:text="1"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn0"
app:layout_constraintEnd_toStartOf="@+id/btn2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn4"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btnTopla"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp"
android:background="@android:color/holo_orange_dark"
android:text="+"
android:textColor="@android:color/background_light"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btnEsittir"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btn3"
app:layout_constraintTop_toBottomOf="@+id/btnCikar"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btn3"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="?attr/colorBackgroundFloating"
android:text="3"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btnVirgul"
app:layout_constraintEnd_toStartOf="@+id/btnTopla"
app:layout_constraintStart_toEndOf="@+id/btn2"
app:layout_constraintTop_toBottomOf="@+id/btn6"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btn2"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="?attr/colorBackgroundFloating"
android:text="2"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn0"
app:layout_constraintEnd_toStartOf="@+id/btn3"
app:layout_constraintStart_toEndOf="@+id/btn1"
app:layout_constraintTop_toBottomOf="@+id/btn5"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btn4"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:background="?attr/colorBackgroundFloating"
android:text="4"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn1"
app:layout_constraintEnd_toStartOf="@+id/btn5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn7"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btn5"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="?attr/colorBackgroundFloating"
android:text="5"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn2"
app:layout_constraintEnd_toStartOf="@+id/btn6"
app:layout_constraintStart_toEndOf="@+id/btn4"
app:layout_constraintTop_toBottomOf="@+id/btn8"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btn6"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="?attr/colorBackgroundFloating"
android:text="6"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn3"
app:layout_constraintEnd_toStartOf="@+id/btnCikar"
app:layout_constraintStart_toEndOf="@+id/btn5"
app:layout_constraintTop_toBottomOf="@+id/btn9"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btnCikar"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp"
android:background="@android:color/holo_orange_dark"
android:text="-"
android:textColor="@android:color/background_light"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btnTopla"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btn6"
app:layout_constraintTop_toBottomOf="@+id/btnCarp"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btn8"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="?attr/colorBackgroundFloating"
android:text="8"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn5"
app:layout_constraintEnd_toStartOf="@+id/btn9"
app:layout_constraintStart_toEndOf="@+id/btn7"
app:layout_constraintTop_toBottomOf="@+id/btnAdd"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btnCarp"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp"
android:background="@android:color/holo_orange_dark"
android:text="\*"
android:textColor="@android:color/background_light"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btnCikar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btn9"
app:layout_constraintTop_toBottomOf="@+id/btnBol"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btn9"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="?attr/colorBackgroundFloating"
android:text="9"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn6"
app:layout_constraintEnd_toStartOf="@+id/btnCarp"
app:layout_constraintStart_toEndOf="@+id/btn8"
app:layout_constraintTop_toBottomOf="@+id/btnYuzde"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/buttonSifirla"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:background="?attr/colorButtonNormal"
android:text="\AC"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn7"
app:layout_constraintEnd_toStartOf="@+id/btnAdd"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/hesapEkrani"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btnAdd"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="5dp"
android:background="?attr/colorButtonNormal"
android:text="\+/-"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn8"
app:layout_constraintEnd_toStartOf="@+id/btnYuzde"
app:layout_constraintStart_toEndOf="@+id/buttonSifirla"
app:layout_constraintTop_toBottomOf="@+id/hesapEkrani"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btnBol"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp"
android:background="@android:color/holo_orange_dark"
android:text="\/"
android:textColor="@android:color/background_light"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btnCarp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btnYuzde"
app:layout_constraintTop_toBottomOf="@+id/hesapEkrani"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btnYuzde"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="5dp"
android:background="?attr/colorButtonNormal"
android:text="\%"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn9"
app:layout_constraintEnd_toStartOf="@+id/btnBol"
app:layout_constraintStart_toEndOf="@+id/btnAdd"
app:layout_constraintTop_toBottomOf="@+id/hesapEkrani"
tools:ignore="MissingConstraints" />
<Button
android:id="@+id/btn7"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:background="?attr/colorBackgroundFloating"
android:text="7"
android:textSize="36sp"
app:layout_constraintBottom_toTopOf="@+id/btn4"
app:layout_constraintEnd_toStartOf="@+id/btn8"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/buttonSifirla"
tools:ignore="MissingConstraints" />
<TextView
android:id="@+id/hesapEkrani"
android:layout_width="0dp"
android:layout_height="200dp"
android:layout_marginStart="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="5dp"
android:layout_marginRight="5dp"
android:fontFamily="sans-serif-light"
android:gravity="center_vertical|right"
android:padding="10dp"
android:paddingLeft="10dp"
android:paddingTop="10dp"
android:paddingRight="10dp"
android:paddingBottom="10dp"
android:text="0"
android:textColor="#FFFFFF"
android:textColorHint="#FFFFFF"
android:textSize="75sp"
android:verticalScrollbarPosition="right"
app:layout_constraintBottom_toTopOf="@+id/buttonSifirla"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
Yukarıdaki kodları xml dosyasına yapıştırdıktan sonra aşağıdaki gibi bir şekil elde etmiş olacaksınız.

Tasarım işlemleri bittikten sonra sıra hesap makinasının nasıl çalışması gerektiğini kodlamaya geldi. Bunu da ilk satırlarda söylediğim gibi MainActivity.java dosyası üzerinden yapacağız.
Button
btn0,
btn1,
btn2,
btn3,
btn4,
btn5,
btn6,
btn7,
btn8,
btn9,
btnTopla,
btnCikar,
btnBol,
btnCarp,
btnEsittir,
btnVirgul,
btnSifirla;
Double ilkSayi;
TextView hesapEkrani;
Boolean virgulDurum;
String islemDurum;
Yukarıdaki sabit tanımlarımızı MainActivity sınıfının hemen altına yaptıktan sonra onCreate fonksiyonu ile aşağıdaki gibi oluşturuyoruz.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn0 = findViewById(R.id.btn0);
btn1 = findViewById(R.id.btn1);
btn2 = findViewById(R.id.btn2);
btn3 = findViewById(R.id.btn3);
btn4 = findViewById(R.id.btn4);
btn5 = findViewById(R.id.btn5);
btn6 = findViewById(R.id.btn6);
btn7 = findViewById(R.id.btn7);
btn8 = findViewById(R.id.btn8);
btn9 = findViewById(R.id.btn9);
btnTopla = findViewById(R.id.btnTopla);
btnCikar = findViewById(R.id.btnCikar);
btnBol = findViewById(R.id.btnBol);
btnCarp = findViewById(R.id.btnCarp);
btnEsittir = findViewById(R.id.btnEsittir);
btnSifirla = findViewById(R.id.buttonSifirla);
btnVirgul = findViewById(R.id.btnVirgul);
hesapEkrani = findViewById(R.id.hesapEkrani);
hesapEkrani.setText("0");
ilkSayi = 0.0;
virgulDurum = false;
islemDurum = "0";
btnEsittir.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_SEMBOL("=");
}
});
btnTopla.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_SEMBOL("+");
}
});
btnCikar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_SEMBOL("-");
}
});
btnCarp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_SEMBOL("*");
}
});
btnBol.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_SEMBOL("/");
}
});
btnSifirla.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_SEMBOL("sifirla");
}
});
btnVirgul.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_SEMBOL(",");
}
});
btn0.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_NUMARA(0);
}
});
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_NUMARA(1);
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_NUMARA(2);
}
});
btn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_NUMARA(3);
}
});
btn4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_NUMARA(4);
}
});
btn5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_NUMARA(5);
}
});
btn6.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_NUMARA(6);
}
});
btn7.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_NUMARA(7);
}
});
btn8.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_NUMARA(8);
}
});
btn9.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TIKLA_NUMARA(9);
}
});
}
Ben kodlama yaparken sembol ve numara tıklamayı ayırıp ikisi için farklı fonksiyonlar yazdım ancak optimize edilmemiş bu kodlar optimize edilerek daha efektif kullanılabilir. Son olarak bu fonksiyonlar şöyleydi,
private void TIKLA_NUMARA(int sayi)
{
if(hesapEkrani.getText().toString() == "0"){
hesapEkrani.setText("");
}
else if(
hesapEkrani.getText().toString() == "+" ||
hesapEkrani.getText().toString() == "*" ||
hesapEkrani.getText().toString() == "/"||
hesapEkrani.getText().toString() == "-" )
{
hesapEkrani.setText("");
}
hesapEkrani.setText(hesapEkrani.getText() + String.valueOf(sayi));
}
Numaraya değilde bir sembole yani + – / * gibi operatörlere tıklandığı zaman ne yapması gerektiğini söyleyen fonksiyonda şu şekilde olacaktır,
private void TIKLA_SEMBOL(String sembol)
{
switch (sembol)
{
default:
{
if(hesapEkrani.getText().toString() == "+" || hesapEkrani.getText().toString() == "*"
|| hesapEkrani.getText().toString() == "/" || hesapEkrani.getText().toString() == "-")
{
if(islemDurum == "*" || islemDurum == "/")
ilkSayi = -1*ilkSayi;
hesapEkrani.setText(sembol);
islemDurum = sembol;
}
else
{
ilkSayi = Double.parseDouble(hesapEkrani.getText().toString());
hesapEkrani.setText(sembol);
islemDurum = sembol;
}
}
break;
case "sifirla":
{
ilkSayi = 0.0;
hesapEkrani.setText("0");
islemDurum = "0";
}
break;
case "=":
{
if(hesapEkrani.getText().toString() == "+" || hesapEkrani.getText().toString() == "*"
|| hesapEkrani.getText().toString() == "/" || hesapEkrani.getText().toString() == "-")
{
}
else
{
switch (islemDurum)
{
default:
{
hesapEkrani.setText(ilkSayi.toString());
}
break;
case "+":
{
ilkSayi = ilkSayi + Double.parseDouble(hesapEkrani.getText().toString());
hesapEkrani.setText(ilkSayi.toString());
}
break;
case "-":
{
ilkSayi = ilkSayi - Double.parseDouble(hesapEkrani.getText().toString());
hesapEkrani.setText(ilkSayi.toString());
}
break;
case "/":
{
ilkSayi = ilkSayi / Double.parseDouble(hesapEkrani.getText().toString());
hesapEkrani.setText(ilkSayi.toString());
}
break;
case "*":
{
ilkSayi = ilkSayi * Double.parseDouble(hesapEkrani.getText().toString());
hesapEkrani.setText(ilkSayi.toString());
}
break;
}
}
}
break;
case ",":
{
}
break;
}
}
Kolay gelsin 🙂
Bir yanıt yazın