06 Nisan 2026 16:52, Pazartesi 81 0
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Bu uygulama, kullanıcının kendi yemek tariflerini dijital ortamda saklayabileceği
ve istediği zaman tekrar görebileceği kişisel bir tarif defteri uygulamasıdır.
Uygulama, SQLite veritabanı üzerinde çalışmaktadır. Bu sayede internet bağlantısına
gerek kalmadan tüm veriler cihazın içinde güvenle saklanır.
Bu proje sayesinde;
- SQLite veritabanı kullanımı
- DatabaseHelper sınıfı yazımı
- Intent ile ekranlar arası geçiş
- putExtra / getExtra ile veri gönderme
- Custom Adapter ve ListView kullanımı
- Cursor ile veritabanı okuma
- ContentValues ile veri yazma
konularını pratik bir şekilde öğrenebilirsiniz.
Bu projede aşağıdaki Android ve Java konuları kullanılmıştır:
public DatabaseHelper(Context context) {
super(context, "YemekRehberi.db", null, 1);
// "YemekRehberi.db" adlı SQLite dosyasını oluşturur (yoksa)
// Versiyon 1 — güncelleme gerekirse onUpgrade() devreye girer
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE tarifler (id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"ad TEXT, malzeme TEXT, yapilis TEXT, favori INTEGER DEFAULT 0)");
// Uygulama ilk kurulduğunda tabloyu oluşturur
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS tarifler"); // Eski tabloyu sil
onCreate(db); // Yeni tabloyu oluştur
}
public void kaydet(String ad, String mal, String yap) {
SQLiteDatabase db = this.getWritableDatabase(); // Yazma modunda aç
ContentValues v = new ContentValues(); // Veri kabı oluştur
v.put("ad", ad);
v.put("malzeme", mal);
v.put("yapilis", yap);
db.insert("tarifler", null, v); // Tabloya ekle
}
public Cursor tumVeriler() {
SQLiteDatabase db = this.getReadableDatabase();
return db.rawQuery("SELECT * FROM tarifler", null);
// Tüm tarifleri bir Cursor nesnesi olarak döndürür
}
public Cursor favorileriGetir() {
SQLiteDatabase db = this.getReadableDatabase();
return db.rawQuery("SELECT * FROM tarifler WHERE favori = 1", null);
// Sadece favori=1 olan satırları döndürür
}
public void favoriGuncelle(String ad, int durum) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues v = new ContentValues();
v.put("favori", durum); // 1 veya 0
db.update("tarifler", v, "ad=?", new String[]{ad}); // Adı eşleşeni güncelle
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // XML'i ekrana yükle
Button btnEkle = findViewById(R.id.btnEkle);
Button btnKayitli = findViewById(R.id.btnKayitli);
Button btnFavori = findViewById(R.id.btnFavori);
btnEkle.setOnClickListener(v -> {
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
startActivity(intent); // Tarif ekleme ekranına geç
});
btnKayitli.setOnClickListener(v -> {
Intent intent = new Intent(MainActivity.this, MainActivity3.class);
startActivity(intent); // Tarif listesi ekranına geç
});
btnFavori.setOnClickListener(v -> {
Intent intent = new Intent(MainActivity.this, MainActivity5.class);
startActivity(intent); // Favoriler ekranına geç
});
}
db = new DatabaseHelper(this); // Veritabanı nesnesini hazırla
btnKaydet.setOnClickListener(v -> {
String ad = etAd.getText().toString().trim(); // Yazıyı al, boşlukları temizle
String mal = etMal.getText().toString().trim();
String yap = etYap.getText().toString().trim();
if (!ad.isEmpty()) { // Ad boş değilse:
db.kaydet(ad, mal, yap); // Veritabanına kaydet
Toast.makeText(this, "Tarif eklendi!", Toast.LENGTH_SHORT).show();
finish(); // Ekranı kapat, bir önceki sayfaya dön
} else {
Toast.makeText(this, "Lütfen ad girin!", Toast.LENGTH_SHORT).show();
}
});
btnGeri.setOnClickListener(v -> finish()); // Kaydetmeden geri dön
// MainActivity3 ile aynı yapı, sadece şu satır farklı:
Cursor c = db.favorileriGetir();
// tumVeriler() yerine favorileriGetir() → WHERE favori = 1 filtresi
// Buton metni de farklı:
btn.setText("❤️"); // "Favoriye Ekle" yerine sadece kalp emoji
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ÖZET — NE ÖĞRENDİK?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✔ SQLite ile uygulama içi kalıcı veri saklama
✔ DatabaseHelper yazarak veritabanını yönetme
✔ ContentValues ile INSERT işlemi
✔ Cursor ile SELECT sonuçlarını satır satır okuma
✔ Intent ile ekranlar arasında geçiş
✔ putExtra / getStringExtra ile veri aktarımı
✔ Custom Adapter ile ListView özelleştirme
✔ getLayoutInflater().inflate() ile XML yükleme
✔ Toast ile kullanıcıya bildirim gösterme
✔ finish() ile mevcut ekranı kapatma
✔ FLAG_ACTIVITY_CLEAR_TOP ile geri yığını temizleme
Bu proje, gerçek dünya uygulamalarının temel yapısını yansıtmaktadır.
Aynı mantıkla Not Defteri, Alışveriş Listesi, Kişi Rehberi gibi
projeler geliştirilebilir.
================================================
Dijital Tarif Defterim | v1.0
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#FFF8E1"
android:padding="24dp"
android:gravity="center_horizontal">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:layout_marginTop="50dp"
android:layout_marginBottom="60dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="????????"
android:textSize="80sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Dijital Tarif Defterim"
android:textSize="28sp"
android:textStyle="bold"
android:textColor="#E64A19"
android:layout_marginTop="10dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Bugün ne pişiriyoruz şef?"
android:textSize="16sp"
android:textColor="#757575"
android:layout_marginTop="5dp" />
</LinearLayout>
<Button
android:id="@+id/btnEkle"
android:layout_width="match_parent"
android:layout_height="65dp"
android:text="???? YENİ TARİF EKLE"
android:textSize="18sp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:background="@drawable/custom_button"
android:layout_marginBottom="16dp"
android:elevation="4dp" />
<Button
android:id="@+id/btnKayitli"
android:layout_width="match_parent"
android:layout_height="65dp"
android:text="???? KAYITLI TARİFLER"
android:textSize="18sp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:background="@drawable/custom_button"
android:layout_marginBottom="16dp"
android:elevation="4dp" />
<Button
android:id="@+id/btnFavori"
android:layout_width="match_parent"
android:layout_height="65dp"
android:text="❤️ FAVORİLERİM"
android:textSize="18sp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:background="@drawable/custom_button"
android:layout_marginBottom="16dp"
android:elevation="4dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:text="v1.0 | Afiyet Olsun!"
android:textSize="12sp"
android:textColor="#BDBDBD" />
</LinearLayout>
package com.example.myapplication;
// Sayfalar arası geçiş (Intent) için gerekli kütüphane
import android.content.Intent;
// Activity ilk oluşturulduğunda kaydedilen durumu almak için (genellikle null başlar)
import android.os.Bundle;
// XML'deki Button bileşenini Java'ya bağlamak için
import android.widget.Button;
// Tüm Activity'lerin temel sınıfı — bu sınıftan türetilerek ekran oluşturulur
import androidx.appcompat.app.AppCompatActivity;
/**
* MainActivity — Uygulamanın ilk açılan ana ekranı.
* Kullanıcıya 3 seçenek sunar:
* 1) Yeni Tarif Ekle → MainActivity2'ye geçer
* 2) Kayıtlı Tarifler → MainActivity3'e geçer
* 3) Favorilerim → MainActivity5'e geçer
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// Üst sınıfın (AppCompatActivity) onCreate metodunu çağır — zorunlu
super.onCreate(savedInstanceState);
// Bu Activity'nin tasarımını activity_main.xml dosyasından yükle
setContentView(R.layout.activity_main);
// XML'deki butonları ID'leri aracılığıyla Java değişkenlerine bağla
// R.id.btnEkle → activity_main.xml içindeki android:id="@+id/btnEkle" ile eşleşir
Button btnEkle = findViewById(R.id.btnEkle);
Button btnKayitli = findViewById(R.id.btnKayitli);
Button btnFavori = findViewById(R.id.btnFavori);
// ── 1. YENİ TARİF EKLE BUTONU ──────────────────────────────────────
// Lambda ifadesi: butona tıklanınca çalışacak kod bloğu
btnEkle.setOnClickListener(v -> {
// Intent: "Bu Activity'den MainActivity2'ye git" komutu
Intent intent = new Intent(MainActivity.this, MainActivity2.class);
startActivity(intent); // Sayfayı başlat (ekrana getir)
});
// ── 2. KAYITLI TARİFLER BUTONU ─────────────────────────────────────
btnKayitli.setOnClickListener(v -> {
Intent intent = new Intent(MainActivity.this, MainActivity3.class);
startActivity(intent);
});
// ── 3. FAVORİLERİM BUTONU ──────────────────────────────────────────
btnFavori.setOnClickListener(v -> {
Intent intent = new Intent(MainActivity.this, MainActivity5.class);
startActivity(intent);
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFF8E1"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="20dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Yeni Tarif Oluştur ✍️"
android:textSize="26sp"
android:textStyle="bold"
android:textColor="#FF5722"
android:layout_gravity="center"
android:layout_marginBottom="20dp"/>
<EditText
android:id="@+id/etYemekAd"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Yemeğin Adı (Örn: Karnıyarık)"
android:background="@android:drawable/editbox_background"
android:padding="12dp"
android:layout_marginBottom="15dp" />
<EditText
android:id="@+id/etMalzemeler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Malzemeler (Her satıra bir tane)"
android:background="@android:drawable/editbox_background"
android:gravity="top"
android:lines="5"
android:padding="12dp"
android:layout_marginBottom="15dp" />
<EditText
android:id="@+id/etYapilis"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Nasıl Hazırlanır? (Adım adım anlat)"
android:background="@android:drawable/editbox_background"
android:gravity="top"
android:lines="8"
android:padding="12dp"
android:layout_marginBottom="25dp" />
<Button
android:id="@+id/btnKaydet"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="TARİFİ DEFTERE EKLE"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:backgroundTint="#4CAF50"
android:layout_marginBottom="10dp" />
<Button
android:id="@+id/btnGeri"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="VAZGEÇ"
android:textColor="#757575"
android:backgroundTint="#EEEEEE"
style="?android:attr/borderlessButtonStyle" />
</LinearLayout>
</ScrollView>
package com.example.myapplication;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText; // Kullanıcının metin yazabildiği kutu bileşeni
import android.widget.Toast; // Ekranın altında kısa süre görünen bildirim balonu
import androidx.appcompat.app.AppCompatActivity;
/**
* MainActivity2 — "Yeni Tarif Ekle" ekranı.
* Kullanıcı yemeğin adını, malzemeleri ve yapılışı girer.
* "Kaydet" butonuna basınca veriler veritabanına (SQLite) yazılır.
*/
public class MainActivity2 extends AppCompatActivity {
// DatabaseHelper sınıfından nesne tanımlıyoruz — tüm DB işlemleri bu üzerinden yapılacak
DatabaseHelper db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2); // activity_main2.xml tasarımını yükle
// DatabaseHelper nesnesini oluştur ve bu Activity'nin context'ini ver
db = new DatabaseHelper(this);
// XML'deki giriş alanlarını ve butonları Java'ya bağla
EditText etAd = findViewById(R.id.etYemekAd); // Yemek adı giriş kutusu
EditText etMal = findViewById(R.id.etMalzemeler); // Malzemeler giriş kutusu
EditText etYap = findViewById(R.id.etYapilis); // Yapılış giriş kutusu
Button btnKaydet = findViewById(R.id.btnKaydet); // Kaydet butonu
Button btnGeri = findViewById(R.id.btnGeri); // Vazgeç / Geri butonu
// ── KAYDET BUTONU ──────────────────────────────────────────────────
btnKaydet.setOnClickListener(v -> {
// EditText'teki yazıyı al, başındaki ve sonundaki boşlukları temizle (trim)
String ad = etAd.getText().toString().trim();
String mal = etMal.getText().toString().trim();
String yap = etYap.getText().toString().trim();
// Yemek adı boş bırakılmamışsa kaydet
if (!ad.isEmpty()) {
db.kaydet(ad, mal, yap); // Veritabanına yaz
// Kullanıcıya başarı mesajı göster (kısa süreli bildirim balonu)
Toast.makeText(MainActivity2.this, "Tarif başarıyla eklendi! ✨", Toast.LENGTH_SHORT).show();
// finish() → Bu Activity'yi kapat, bir önceki ekrana (MainActivity) dön
finish();
} else {
// Ad boş bırakıldıysa uyarı göster, kaydetme
Toast.makeText(MainActivity2.this, "Lütfen yemeğin adını yazın!", Toast.LENGTH_SHORT).show();
}
});
// ── VAZGEÇ / GERİ BUTONU ───────────────────────────────────────────
btnGeri.setOnClickListener(v -> {
// Hiçbir şey kaydetmeden bu ekranı kapat, bir önceki sayfaya dön
finish();
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#FFF8E1"> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Kayıtlı Tariflerim ????"
android:textSize="24sp"
android:textStyle="bold"
android:textColor="#E64A19"
android:gravity="center"
android:padding="20dp" />
<ListView
android:id="@+id/listview1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/transparent"
android:dividerHeight="8dp"
android:padding="10dp"
android:clipToPadding="false" />
</LinearLayout>
package com.example.myapplication;
import android.content.Intent;
import android.database.Cursor; // Veritabanı sorgu sonuçlarını okumak için
import android.os.Bundle;
import android.view.View; // Ekrandaki her UI elemanının temel sınıfı
import android.view.ViewGroup; // Birden fazla View'ı içinde barındıran kap (örn: LinearLayout)
import android.widget.BaseAdapter; // ListView için özel adaptör yazarken türetilen temel sınıf
import android.widget.Button;
import android.widget.ListView; // Verileri dikey liste halinde gösteren bileşen
import android.widget.TextView; // Metin gösterme bileşeni
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList; // Dinamik büyüyebilen dizi listesi
/**
* MainActivity3 — "Kayıtlı Tarifler" ekranı.
* Veritabanındaki TÜM tarifleri liste halinde gösterir.
* Her kart üzerinde:
* - Yemek adı görünür
* - ❤️ butonuyla favoriye eklenebilir
* - Karta tıklanınca MainActivity4 (detay) açılır
*/
public class MainActivity3 extends AppCompatActivity {
ListView listView; // Tariflerin listeleneceği ListView bileşeni
DatabaseHelper db; // Veritabanı işlemleri için yardımcı nesne
// Veritabanından okunan veriler bu listelerde tutulur (index'ler birbiriyle eşleşir)
ArrayList<String> adlar = new ArrayList<>(); // Yemek adları listesi
ArrayList<String> mallar = new ArrayList<>(); // Malzemeler listesi
ArrayList<String> yaplar = new ArrayList<>(); // Yapılış listesi
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3); // activity_main3.xml tasarımını yükle
// XML'deki ListView'ı Java'ya bağla
listView = findViewById(R.id.listview1);
// Veritabanı nesnesini oluştur
db = new DatabaseHelper(this);
// Veritabanındaki tarifleri yükle ve listeyi doldur
verileriYukle();
}
/**
* verileriYukle() — Veritabanından tüm tarifleri okur ve listeleri doldurur.
* Her çağrıda önce listeleri temizler (clear), sonra tekrar doldurur.
* Bu sayede yeni eklenen tarifler de görünür.
*/
private void verileriYukle() {
// Önceki verileri temizle (sayfayı yenileme amacıyla)
adlar.clear();
mallar.clear();
yaplar.clear();
// Veritabanından tüm tarifleri çek (Cursor = sonuç tablosu)
Cursor c = db.tumVeriler();
if (c != null) {
// Cursor'ı satır satır ilerlet
while (c.moveToNext()) {
adlar.add(c.getString(1)); // 2. sütun (index 1) = "ad"
mallar.add(c.getString(2)); // 3. sütun (index 2) = "malzeme"
yaplar.add(c.getString(3)); // 4. sütun (index 3) = "yapilis"
}
c.close(); // Cursor'ı kapat — bellek sızıntısını önler
}
// Özel adaptörü ListView'a bağla (her satır için list_item_layout.xml kullanılır)
listView.setAdapter(new CustomAdapter());
}
/**
* CustomAdapter — ListView'ın her satırını nasıl göstereceğini belirleyen iç sınıf.
* BaseAdapter'dan türetilmiş, her tarif için list_item_layout.xml tasarımını kullanır.
*/
class CustomAdapter extends BaseAdapter {
// Listede kaç eleman olduğunu söyler (ListView bu sayıyı kullanır)
@Override public int getCount() { return adlar.size(); }
// Belirli bir pozisyondaki nesneyi döndürür (burada kullanmıyoruz)
@Override public Object getItem(int i) { return null; }
// Her elemanın benzersiz ID'si (burada kullanmıyoruz)
@Override public long getItemId(int i) { return 0; }
/**
* getView() — Her liste satırının görünümünü oluşturur ve döndürür.
* ListView bu metodu her satır için tekrar tekrar çağırır.
*
* @param position → Hangi sıradaki eleman gösteriliyor (0'dan başlar)
* @param convertView → Daha önce oluşturulmuş ve geri dönüştürülmüş view (performans için)
* @param parent → ListView'ın kendisi
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Eğer geri dönüştürülecek view yoksa yenisini XML'den şişir (inflate)
if (convertView == null) {
// list_item_layout.xml → her satırın CardView tasarımı
convertView = getLayoutInflater().inflate(R.layout.list_item_layout, null);
}
// XML'deki bileşenleri bu satır'ın view'una bağla
TextView txtAd = convertView.findViewById(R.id.txtYemekAdi); // Yemek adı yazısı
Button btnFav = convertView.findViewById(R.id.btnFavoriEkle); // ❤️ butonu
// Bu sıradaki yemek adını TextView'a yaz
txtAd.setText(adlar.get(position));
// ── FAVORİ BUTONU ──────────────────────────────────────────────
btnFav.setOnClickListener(v -> {
// Bu tarifin favori durumunu 1 (favoride) olarak güncelle
db.favoriGuncelle(adlar.get(position), 1);
// Kullanıcıya bildirim göster
Toast.makeText(MainActivity3.this,
adlar.get(position) + " favorilere eklendi! ❤️",
Toast.LENGTH_SHORT).show();
});
// ── KART TIKLANINCA (SATIR TIKLANINCA) ─────────────────────────
convertView.setOnClickListener(v -> {
// Detay sayfasına (MainActivity4) git
Intent intent = new Intent(MainActivity3.this, MainActivity4.class);
// putExtra: bir sonraki Activity'ye veri gönder (anahtar-değer)
intent.putExtra("pAd", adlar.get(position)); // Tarif adını gönder
intent.putExtra("pMal", mallar.get(position)); // Malzemeleri gönder
intent.putExtra("pYap", yaplar.get(position)); // Yapılışı gönder
startActivity(intent); // Detay sayfasını aç
});
return convertView; // Hazırlanan satır görünümünü ListView'a teslim et
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFDF5"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="24dp">
<TextView
android:id="@+id/txtBaslik"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Yemek Adı"
android:textSize="30sp"
android:textStyle="bold"
android:textColor="#E64A19"
android:gravity="center"
android:layout_marginBottom="16dp" />
<View
android:layout_width="100dp"
android:layout_height="3dp"
android:background="#FFCCBC"
android:layout_gravity="center"
android:layout_marginBottom="24dp" />
<TextView
android:id="@+id/txtDetay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Malzemeler ve Yapılış..."
android:textSize="18sp"
android:lineSpacingExtra="10dp"
android:textColor="#37474F"
android:background="@android:color/white"
android:padding="20dp"
android:elevation="2dp" />
<Button
android:id="@+id/btnGiris"
android:layout_width="match_parent"
android:layout_height="55dp"
android:text="KAPAT VE DÖN"
android:textColor="#FFFFFF"
android:layout_marginTop="30dp"
android:backgroundTint="#FF5722"
android:background="@drawable/custom_button" />
</LinearLayout>
</ScrollView>
package com.example.myapplication;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
import android.widget.TextView; // Metin gösterme bileşeni
import androidx.appcompat.app.AppCompatActivity;
/**
* MainActivity4 — "Tarif Detayı" ekranı.
* MainActivity3'teki bir karta tıklanınca açılır.
* Önceki ekrandan Intent aracılığıyla gelen:
* - Yemek adı (pAd)
* - Malzemeler (pMal)
* - Yapılış (pYap)
* bilgilerini alıp ekranda gösterir.
*/
public class MainActivity4 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main4); // activity_main4.xml tasarımını yükle
// XML'deki bileşenleri Java'ya bağla
TextView tBaslik = findViewById(R.id.txtBaslik); // Yemek adının yazıldığı büyük başlık
TextView tDetay = findViewById(R.id.txtDetay); // Malzeme ve yapılışın gösterildiği alan
Button btnGiris = findViewById(R.id.btnGiris); // "Kapat ve Dön" butonu
// ── ÖNCEKİ EKRANDAN GELEN VERİLERİ AL ─────────────────────────────
// getIntent() → Bu Activity'yi açan Intent'i getirir
// getStringExtra("anahtar") → Intent ile gönderilen değeri okur
if (getIntent() != null) {
// Yemek adını başlığa yaz
tBaslik.setText(getIntent().getStringExtra("pAd"));
// Malzeme ve yapılış verilerini tek bir metin olarak birleştir
String malzeme = getIntent().getStringExtra("pMal");
String yapilis = getIntent().getStringExtra("pYap");
// \n → Satır sonu (alt satıra geç), metni biçimlendir
tDetay.setText("Malzemeler:\n" + malzeme + "\n\nYapılışı:\n" + yapilis);
}
// ── KAPAT VE DÖN BUTONU ────────────────────────────────────────────
btnGiris.setOnClickListener(v -> {
// MainActivity'ye dön (geri stack'i temizleyerek — tekrar MainActivity açılmaz)
Intent intent = new Intent(MainActivity4.this, MainActivity.class);
// FLAG_ACTIVITY_CLEAR_TOP: Geri yığınındaki tüm ara ekranları kapat,
// MainActivity zaten açıksa onu yeni oluşturma, mevcut olanı kullan
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#FFF0F0"> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Favori Tariflerim ❤️"
android:textSize="26sp"
android:textStyle="bold"
android:textColor="#D32F2F"
android:gravity="center"
android:padding="20dp" />
<ListView
android:id="@+id/liste_view_favori"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="@android:color/transparent"
android:dividerHeight="10dp"
android:padding="10dp"
android:clipToPadding="false" />
</LinearLayout>
package com.example.myapplication;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
/**
* MainActivity5 — "Favorilerim" ekranı.
* MainActivity3'e çok benzer; tek farkı sadece favori=1 olan tarifleri gösterir.
* Karta tıklanınca yine MainActivity4 (detay) açılır.
* ❤️ butonuna basınca o tarifin favori etiketi gösterilir.
*/
public class MainActivity5 extends AppCompatActivity {
ListView listView; // Favori tariflerin listeleneceği bileşen
DatabaseHelper db; // Veritabanı yardımcı nesnesi
// Sadece favori tariflerin bilgileri bu listelerde tutulur
ArrayList<String> fAdlar = new ArrayList<>(); // Favori yemek adları
ArrayList<String> fMallar = new ArrayList<>(); // Favori malzemeler
ArrayList<String> fYaplar = new ArrayList<>(); // Favori yapılışlar
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main5); // activity_main5.xml tasarımını yükle
// ListView bileşenini XML'den bul ve bağla
listView = findViewById(R.id.liste_view_favori);
db = new DatabaseHelper(this);
// ── FAVORİ TARİFLERİ VERİTABANINDAN ÇEK ───────────────────────────
// favorileriGetir() → WHERE favori = 1 sorgusunu çalıştırır
Cursor c = db.favorileriGetir();
if (c != null) {
// Cursor'ı satır satır ilerlet ve listelere ekle
while (c.moveToNext()) {
fAdlar.add(c.getString(1)); // "ad" sütunu
fMallar.add(c.getString(2)); // "malzeme" sütunu
fYaplar.add(c.getString(3)); // "yapilis" sütunu
}
c.close(); // Cursor'ı kapat — bellek sızıntısını önle
}
// Özel adaptörü ListView'a bağla
listView.setAdapter(new CustomAdapter());
}
/**
* CustomAdapter — Favori tariflerin her satırını oluşturan iç sınıf.
* MainActivity3'teki ile aynı mantık; fark olarak buton metni "❤️" olarak sabit.
*/
class CustomAdapter extends BaseAdapter {
@Override public int getCount() { return fAdlar.size(); } // Favori sayısı
@Override public Object getItem(int i) { return null; }
@Override public long getItemId(int i) { return 0; }
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Geri dönüştürülecek view yoksa XML'den yeni oluştur
if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.list_item_layout, null);
}
// Satırdaki bileşenleri bul ve bağla
TextView tv = convertView.findViewById(R.id.txtYemekAdi); // Yemek adı
Button btn = convertView.findViewById(R.id.btnFavoriEkle); // ❤️ butonu
// Bu sıradaki favori yemeğin adını yaz
tv.setText(fAdlar.get(position));
// Favoriler sayfasında buton "❤️" işareti gösterir
// (Buraya "Favoriden Çıkar" işlevi de eklenebilir)
btn.setText("❤️");
// ── KART TIKLANINCA DETAY SAYFASINA GİT ───────────────────────
convertView.setOnClickListener(v -> {
Intent intent = new Intent(MainActivity5.this, MainActivity4.class);
// Seçilen favori tarifin bilgilerini detay sayfasına gönder
intent.putExtra("pAd", fAdlar.get(position));
intent.putExtra("pMal", fMallar.get(position));
intent.putExtra("pYap", fYaplar.get(position));
startActivity(intent);
});
return convertView; // Hazır satırı ListView'a teslim et
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardCornerRadius="15dp"
app:cardElevation="6dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp"
android:background="#FFFFFF">
<TextView
android:id="@+id/txtYemekAdi"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Yemek Adı"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="#333333" />
<Button
android:id="@+id/btnFavoriEkle"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:text="❤️"
android:backgroundTint="#FF5722"
android:textColor="#FFFFFF" />
</LinearLayout>
</androidx.cardview.widget.CardView>
package com.example.myapplication;
// Veritabanı işlemleri için gerekli Android kütüphaneleri
import android.content.ContentValues; // Veritabanına eklenecek veriyi taşıyan kap (anahtar-değer çifti)
import android.content.Context; // Uygulamanın bağlamını (context) temsil eder, veritabanına erişmek için lazım
import android.database.Cursor; // SQL sorgusundan dönen sonuçları satır satır okumak için kullanılır
import android.database.sqlite.SQLiteDatabase; // SQLite veritabanı nesnesini temsil eder (okuma/yazma işlemleri)
import android.database.sqlite.SQLiteOpenHelper; // Veritabanını oluşturmayı ve güncellemeyi yöneten yardımcı sınıf
/**
* DatabaseHelper — Uygulamanın tüm veritabanı işlemlerini yöneten sınıf.
* SQLiteOpenHelper'dan türetilmiş olduğu için veritabanını otomatik oluşturur ve yönetir.
*/
public class DatabaseHelper extends SQLiteOpenHelper {
/**
* Constructor (Yapıcı metot) — Bu sınıftan nesne oluşturulurken çalışır.
* super(...) ile üst sınıfa şunları söylüyoruz:
* - "YemekRehberi.db" adında bir SQLite dosyası kullan
* - Versiyon numarası 1
* Eğer bu dosya yoksa Android otomatik olarak oluşturur.
*/
public DatabaseHelper(Context context) {
super(context, "YemekRehberi.db", null, 1);
}
/**
* onCreate — Veritabanı ilk kez oluşturulduğunda (uygulama ilk çalıştırıldığında) bir kez çalışır.
* Burada tablomuzu oluşturuyoruz:
* id → Her tarifin benzersiz numarası (otomatik artar: 1, 2, 3...)
* ad → Yemeğin adı (metin)
* malzeme → Malzeme listesi (metin)
* yapilis → Nasıl yapıldığı (metin)
* favori → Favoride mi değil mi? (0 = hayır, 1 = evet, varsayılan 0)
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE tarifler (id INTEGER PRIMARY KEY AUTOINCREMENT, ad TEXT, malzeme TEXT, yapilis TEXT, favori INTEGER DEFAULT 0)");
}
/**
* onUpgrade — Uygulama güncellenip veritabanı versiyonu değiştiğinde çalışır.
* Burada eski tabloyu silip yeniden oluşturuyoruz.
* (Gerçek uygulamada veri kaybını önlemek için daha dikkatli bir güncelleme yapılır)
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS tarifler"); // Eski tabloyu sil
onCreate(db); // Yeni tabloyu oluştur
}
/**
* kaydet() — Yeni bir tarif veritabanına ekler.
* ContentValues ile SQL sütunlarına hangi veriyi yazacağımızı belirliyoruz,
* sonra db.insert() ile "tarifler" tablosuna ekliyoruz.
*
* @param ad → Yemeğin adı
* @param mal → Malzemeler
* @param yap → Yapılış tarifi
*/
public void kaydet(String ad, String mal, String yap) {
SQLiteDatabase db = this.getWritableDatabase(); // Yazma modunda veritabanını aç
ContentValues v = new ContentValues(); // Eklenecek veriyi hazırla
v.put("ad", ad); // "ad" sütununa yemeğin adını yaz
v.put("malzeme", mal); // "malzeme" sütununa malzemeleri yaz
v.put("yapilis", yap); // "yapilis" sütununa tarifi yaz
db.insert("tarifler", null, v); // "tarifler" tablosuna ekle
}
/**
* tumVeriler() — Veritabanındaki TÜM tarifleri döndürür.
* SELECT * FROM tarifler → Tablodaki her satırı getir.
* Cursor nesnesi ile sonuçlar satır satır okunabilir.
*/
public Cursor tumVeriler() {
SQLiteDatabase db = this.getReadableDatabase(); // Sadece okuma modunda aç
return db.rawQuery("SELECT * FROM tarifler", null);
}
/**
* favorileriGetir() — Sadece favori işaretli tarifleri döndürür.
* WHERE favori = 1 → Sadece favoriye eklenmiş olanları filtrele.
*/
public Cursor favorileriGetir() {
SQLiteDatabase db = this.getReadableDatabase();
return db.rawQuery("SELECT * FROM tarifler WHERE favori = 1", null);
}
/**
* favoriGuncelle() — Bir tarifin favori durumunu değiştirir.
* UPDATE tarifler SET favori = ? WHERE ad = ?
* Yani: "Adı verilen tarifte favori sütununu güncelle."
*
* @param ad → Hangi tarifin favorisi değişecek
* @param durum → 1 = favoriye ekle, 0 = favoriden çıkar
*/
public void favoriGuncelle(String ad, int durum) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues v = new ContentValues();
v.put("favori", durum); // Yeni favori durumunu hazırla
db.update("tarifler", v, "ad=?", new String[]{ad}); // Adı eşleşen satırı güncelle
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication">
<activity android:name=".MainActivity5"></activity>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity2" />
<activity android:name=".MainActivity3" />
<activity android:name=".MainActivity4" />
</application>
</manifest>
Rozerin Erdinç
atp 11 a
Lütfen yorumlarınızda saygılı, yapıcı ve anlaşılır bir dil kullanın.
Küfür, hakaret ya da spam içerikler onaylanmaz.