Bu makalede, Android uygulaması kullanarak yemek siparişi sistemi geliştireceğiz. Uygulama, kullanıcıların çorba, ana yemek, pilav ve tatlı gibi öğeleri seçebilmesini sağlayacak. Kullanıcılar, her yemek için CheckBox
kullanarak seçimini yapacak ve yemek miktarını artırıp azaltabilecek. Ayrıca, tüm siparişler TextView
ile detaylı olarak gösterilecek.
Uygulama, XML ile kullanıcı arayüzünü tasarlarken, öğelerin düzenini kontrol etmek için LinearLayout
gibi yerleşim bileşenlerini kullanacak. Java kodu ise, kullanıcı etkileşimlerine cevap verecek ve siparişlerin doğru şekilde hesaplanmasını sağlayacak.
1. XML ile Kullanıcı Arayüzü Tasarımı

1.1. Ana Yapı: LinearLayout
Uygulamanın ana yapısı LinearLayout
içinde düzenlenmiştir. android:orientation="vertical"
özelliği, içerdiği öğelerin dikey olarak yerleştirilmesini sağlar. Ayrıca, sol ve sağ kenarlardan 15dp ve üst kısımdan 20dp boşluk verilmiştir.
1 2 3 4 5 6 7 8 9 10 11 12 | <LinearLayout 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:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_marginHorizontal="15dp" android:layout_marginTop="20dp" tools:context=".MainActivity"> |
1.2. Her Bir Menü Öğesi İçin LinearLayout
Her bir öğe (çorba, ana yemek, pilav, tatlı) için bir LinearLayout
içinde CheckBox
(yemek seçimi için), artırma ve azaltma butonları (ImageView
), miktar göstergesi (TextView
) yer alır. Bu öğelerin düzeni, yatay olarak hizalanmış ve her öğe için genişlik wrap_content
olacak şekilde ayarlanmıştır.
ImageView de kullanmak için gerekli ikonları res klasörü içinde bulunan drawable içine kopyala-yapıştır yöntemiye eklemeyi unutmayın.
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 | <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="16dp" android:orientation="horizontal"> <CheckBox android:id="@+id/checkBox_corba" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="4" android:textSize="18sp" android:text="Çorba" /> <ImageView android:id="@+id/imageView_corba_azalt" android:layout_width="32dp" android:layout_height="32dp" app:srcCompat="@drawable/minus64" /> <TextView android:id="@+id/editTextNumber_corba_adet" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:text="0" android:textAlignment="center" android:textSize="20sp" /> <ImageView android:id="@+id/imageView_corba_arttir" android:layout_width="32dp" android:layout_height="32dp" app:srcCompat="@drawable/add64" /> </LinearLayout> |
Her yemek için aynı yapı kullanılmıştır. CheckBox
seçimi, TextView
miktar göstergesi, artırma ve azaltma işlemi için ImageView
‘lar yerleştirilmiştir.
1.3. Sipariş Ver Butonu ve Detay TextView
Kullanıcının siparişini tamamlaması için bir Button
eklenmiş ve sipariş detaylarının gösterileceği bir TextView
yerleştirilmiştir.
1 2 3 4 5 6 7 8 9 10 11 12 13 | <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Sipariş Ver" /> <TextView android:id="@+id/textView_detay" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Sipariş Detay:" /> |
Tasarım kodlarımızın tamamı, yani activity_main.xml dosyamızın tamamı aşağıdaki gibi oluşacaktı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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:id="@+id/main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_marginHorizontal="15dp" android:layout_marginTop="20dp" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="16dp" android:orientation="horizontal"> <CheckBox android:id="@+id/checkBox_corba" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="4" android:clickable="false" android:textSize="18sp" android:text="Çorba" /> <ImageView android:id="@+id/imageView_corba_azalt" android:layout_width="32dp" android:layout_height="32dp" android:layout_weight="1" android:layout_gravity="center" app:srcCompat="@drawable/minus64" /> <TextView android:id="@+id/editTextNumber_corba_adet" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:ems="10" android:text="0" android:textAlignment="center" android:textSize="20sp" android:layout_gravity="center" android:inputType="number" /> <ImageView android:id="@+id/imageView_corba_arttir" android:layout_width="32dp" android:layout_height="32dp" android:layout_weight="1" android:layout_gravity="center" app:srcCompat="@drawable/add64" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="16dp" android:orientation="horizontal"> <CheckBox android:id="@+id/checkBox_anayemek" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="4" android:textSize="18sp" android:clickable="false" android:text="Ana Yemek" /> <ImageView android:id="@+id/imageView_anayemek_azalt" android:layout_width="32dp" android:layout_height="32dp" android:layout_weight="1" android:layout_gravity="center" app:srcCompat="@drawable/minus64" /> <TextView android:id="@+id/editTextNumber_anayemek_adet" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:ems="10" android:text="0" android:textAlignment="center" android:textSize="20sp" android:layout_gravity="center" android:inputType="number" /> <ImageView android:id="@+id/imageView_anayemek_arttir" android:layout_width="32dp" android:layout_height="32dp" android:layout_weight="1" android:layout_gravity="center" app:srcCompat="@drawable/add64" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="16dp" android:orientation="horizontal"> <CheckBox android:id="@+id/checkBox_pilav" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="4" android:textSize="18sp" android:clickable="false" android:text="Pilav" /> <ImageView android:id="@+id/imageView_pilav_azalt" android:layout_width="32dp" android:layout_height="32dp" android:layout_weight="1" android:layout_gravity="center" app:srcCompat="@drawable/minus64" /> <TextView android:id="@+id/editTextNumber_pilav_adet" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:ems="10" android:text="0" android:textAlignment="center" android:textSize="20sp" android:layout_gravity="center" android:inputType="number" /> <ImageView android:id="@+id/imageView_pilav_arttir" android:layout_width="32dp" android:layout_height="32dp" android:layout_weight="1" android:layout_gravity="center" app:srcCompat="@drawable/add64" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="16dp" android:orientation="horizontal"> <CheckBox android:id="@+id/checkBox_tatli" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="4" android:textSize="18sp" android:clickable="false" android:text="Tatlı" /> <ImageView android:id="@+id/imageView_tatli_azalt" android:layout_width="32dp" android:layout_height="32dp" android:layout_weight="1" android:layout_gravity="center" app:srcCompat="@drawable/minus64" /> <TextView android:id="@+id/editTextNumber_tatli_adet" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:ems="10" android:text="0" android:textAlignment="center" android:textSize="20sp" android:layout_gravity="center" android:inputType="number" /> <ImageView android:id="@+id/imageView_tatli_arttir" android:layout_width="32dp" android:layout_height="32dp" android:layout_weight="1" android:layout_gravity="center" app:srcCompat="@drawable/add64" /> </LinearLayout> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="18dp" android:textSize="18sp" android:text="Sipariş Ver" /> <TextView android:id="@+id/textView_detay" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:textSize="18sp" android:text="Sipariş Detay:" /> </LinearLayout> |
2. Java ile Mantık ve İşlem Tanımlamaları
2.1. Bileşenlerin Bağlanması
XML’de tanımlanan her bir bileşeni Java kodu ile bağlamak için findViewById
fonksiyonu kullanılır.
1 2 3 4 5 6 7 8 9 10 11 12 | checkBoxCorba = findViewById(R.id.checkBox_corba); checkBoxAnayemek = findViewById(R.id.checkBox_anayemek); checkBoxPilav = findViewById(R.id.checkBox_pilav); checkBoxTatli = findViewById(R.id.checkBox_tatli); textViewCorbaAdet = findViewById(R.id.editTextNumber_corba_adet); textViewAnayemekAdet = findViewById(R.id.editTextNumber_anayemek_adet); textViewPilavAdet = findViewById(R.id.editTextNumber_pilav_adet); textViewTatliAdet = findViewById(R.id.editTextNumber_tatli_adet); textViewDetay = findViewById(R.id.textView_detay); |
2.2. Artırma ve Azaltma İşlemleri
Yemek miktarını artırma ve azaltma işlemleri, kullanıcı butona tıkladığında gerçekleşir. updateItem
fonksiyonu, artırma veya azaltma işlemine göre miktarı günceller.
1 2 3 4 | imageViewCorbaArttir.setOnClickListener(v -> updateItem(textViewCorbaAdet, checkBoxCorba, true)); imageViewCorbaAzalt.setOnClickListener(v -> updateItem(textViewCorbaAdet, checkBoxCorba, false)); |
1 2 3 4 5 6 7 8 9 10 11 12 | private void updateItem(TextView textView, CheckBox checkBox, boolean isIncrement) { int count = Integer.parseInt(textView.getText().toString()); if (isIncrement) { count++; } else if (count > 0) { count--; } textView.setText(String.valueOf(count)); checkBox.setChecked(count > 0); } |
2.3. Sipariş Detaylarını Alma
Kullanıcı sipariş ver butonuna tıkladığında, sipariş detayları hesaplanır. Hangi yemeklerden kaç tane sipariş verildiği ve toplam fiyat gösterilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | private String getOrderDetails() { int toplamFiyat = 0; String orderDetails = "Sipariş Detayları:\n----------------------------\n"; if (checkBoxCorba.isChecked()) { int adet = Integer.parseInt(textViewCorbaAdet.getText().toString()); toplamFiyat += adet * fiyatCorba; orderDetails += "Çorba: " + adet + " x " + fiyatCorba + " = " + (adet * fiyatCorba) + " TL\n"; } // Diğer yemekler için aynı mantık... if (orderDetails.equals("Sipariş Detayları:\n")) { return "Sipariş bulunmamaktadır."; } orderDetails += "\nToplam Fiyat: " + toplamFiyat + " TL"; return orderDetails; } |
3. Fiyatlandırma
Her öğe için fiyat sabitlenmiştir. Bu fiyatlar, her öğe seçildiğinde toplam fiyata eklenir. Örneğin:
1 2 3 4 5 6 | private final int fiyatCorba = 55; private final int fiyatPilav = 80; private final int fiyatTatli = 60; private final int fiyatAnayemek = 90; |
4. Sonuç
Bu uygulama, Android’de CheckBox
, ImageView
, TextView
, Button
gibi temel bileşenlerin nasıl kullanılacağını ve etkileşimli bir sipariş sistemi oluşturmayı gösterir. Kullanıcılar, yemek seçip miktarlarını artırıp azaltarak sipariş verebilir, uygulama ise sipariş detaylarını ve toplam fiyatı hesaplar. Bu örnek, Android programlamadaki temel yerleşim bileşenlerini ve etkileşim mantığını öğrenmek için faydalı bir örnek teşkil eder.
MainActivity.java kodlarının tamamı aşağıdaki gibi oluşacaktı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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | package com.example.siparisadet; import android.os.Bundle; import android.widget.Button; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import androidx.activity.EdgeToEdge; import androidx.appcompat.app.AppCompatActivity; import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; public class MainActivity extends AppCompatActivity { private CheckBox checkBoxCorba, checkBoxAnayemek, checkBoxPilav, checkBoxTatli; private TextView textViewCorbaAdet, textViewAnayemekAdet, textViewPilavAdet, textViewTatliAdet; private ImageView imageViewCorbaArttir, imageViewCorbaAzalt; private ImageView imageViewAnayemekArttir, imageViewAnayemekAzalt; private ImageView imageViewPilavArttir, imageViewPilavAzalt; private ImageView imageViewTatliArttir, imageViewTatliAzalt; private TextView textViewDetay; private final int fiyatCorba = 55; private final int fiyatPilav = 80; private final int fiyatTatli = 60; private final int fiyatAnayemek = 90; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EdgeToEdge.enable(this); setContentView(R.layout.activity_main); ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); return insets; }); // CheckBox ve diğer bileşenleri bağlama checkBoxCorba = findViewById(R.id.checkBox_corba); checkBoxAnayemek = findViewById(R.id.checkBox_anayemek); checkBoxPilav = findViewById(R.id.checkBox_pilav); checkBoxTatli = findViewById(R.id.checkBox_tatli); textViewCorbaAdet = findViewById(R.id.editTextNumber_corba_adet); textViewAnayemekAdet = findViewById(R.id.editTextNumber_anayemek_adet); textViewPilavAdet = findViewById(R.id.editTextNumber_pilav_adet); textViewTatliAdet = findViewById(R.id.editTextNumber_tatli_adet); textViewDetay = findViewById(R.id.textView_detay); imageViewCorbaArttir = findViewById(R.id.imageView_corba_arttir); imageViewCorbaAzalt = findViewById(R.id.imageView_corba_azalt); imageViewAnayemekArttir = findViewById(R.id.imageView_anayemek_arttir); imageViewAnayemekAzalt = findViewById(R.id.imageView_anayemek_azalt); imageViewPilavArttir = findViewById(R.id.imageView_pilav_arttir); imageViewPilavAzalt = findViewById(R.id.imageView_pilav_azalt); imageViewTatliArttir = findViewById(R.id.imageView_tatli_arttir); imageViewTatliAzalt = findViewById(R.id.imageView_tatli_azalt); // Çorba için arttır ve azalt işlemleri imageViewCorbaArttir.setOnClickListener(v -> updateItem(textViewCorbaAdet, checkBoxCorba, true)); imageViewCorbaAzalt.setOnClickListener(v -> updateItem(textViewCorbaAdet, checkBoxCorba, false)); // Ana yemek için arttır ve azalt işlemleri imageViewAnayemekArttir.setOnClickListener(v -> updateItem(textViewAnayemekAdet, checkBoxAnayemek, true)); imageViewAnayemekAzalt.setOnClickListener(v -> updateItem(textViewAnayemekAdet, checkBoxAnayemek, false)); // Pilav için arttır ve azalt işlemleri imageViewPilavArttir.setOnClickListener(v -> updateItem(textViewPilavAdet, checkBoxPilav, true)); imageViewPilavAzalt.setOnClickListener(v -> updateItem(textViewPilavAdet, checkBoxPilav, false)); // Tatlı için arttır ve azalt işlemleri imageViewTatliArttir.setOnClickListener(v -> updateItem(textViewTatliAdet, checkBoxTatli, true)); imageViewTatliAzalt.setOnClickListener(v -> updateItem(textViewTatliAdet, checkBoxTatli, false)); // Sipariş ver butonu findViewById(R.id.button).setOnClickListener(v -> { String orderDetails = getOrderDetails(); textViewDetay.setText(orderDetails); // textView, sipariş detaylarını gösterecek TextView }); } // Adet artırma/azaltma ve CheckBox kontrol mantığı private void updateItem(TextView textView, CheckBox checkBox, boolean isIncrement) { int count = Integer.parseInt(textView.getText().toString()); if (isIncrement) { count++; } else if (count > 0) { count--; } textView.setText(String.valueOf(count)); checkBox.setChecked(count > 0); } // Sipariş detaylarını alma private String getOrderDetails() { int toplamFiyat = 0; String orderDetails = "Sipariş Detayları:\n----------------------------\n"; if (checkBoxCorba.isChecked()) { int adet = Integer.parseInt(textViewCorbaAdet.getText().toString()); toplamFiyat += adet * fiyatCorba; orderDetails += "Çorba: " + adet + " x " + fiyatCorba + " = " + (adet * fiyatCorba) + " TL\n"; } if (checkBoxAnayemek.isChecked()) { int adet = Integer.parseInt(textViewAnayemekAdet.getText().toString()); toplamFiyat += adet * fiyatAnayemek; orderDetails += "Ana Yemek: " + adet + " x " + fiyatAnayemek + " = " + (adet * fiyatAnayemek) + " TL\n"; } if (checkBoxPilav.isChecked()) { int adet = Integer.parseInt(textViewPilavAdet.getText().toString()); toplamFiyat += adet * fiyatPilav; orderDetails += "Pilav: " + adet + " x " + fiyatPilav + " = " + (adet * fiyatPilav) + " TL\n"; } if (checkBoxTatli.isChecked()) { int adet = Integer.parseInt(textViewTatliAdet.getText().toString()); toplamFiyat += adet * fiyatTatli; orderDetails += "Tatlı: " + adet + " x " + fiyatTatli + " = " + (adet * fiyatTatli) + " TL\n"; } if (orderDetails.equals("Sipariş Detayları:\n")) { return "Sipariş bulunmamaktadır."; } // Toplam fiyatı ekleyelim orderDetails += "\nToplam Fiyat: " + toplamFiyat + " TL"; return orderDetails; } } |
Örnek ekran çıktısı aşağıdaki gibi olacaktır.
