12 Nisan 2026 16:13, Pazar 359 0
Geliştirdiğimiz uygulama şu özelliklere sahiptir:
.Giriş/Kayıt Ekranı: E-posta ve şifre doğrulaması ile güvenli kullanıcı girişi ve yeni kullanıcı kaydı.
.Profil Sayfası: SharedData üzerinden giriş yapan kullanıcının adı ve e-postasının gösterilmesi.
.Kullanıcılar Ekranı: Kayıtlı tüm kullanıcıların listelenmesi, aktif kullanıcının vurgulanması.
.Kategori Seçimi: Yerli ve Yabancı yapımlar arasında seçim imkânı.
.Film Kartları: Her filme ait afiş görseli, yönetmen bilgisi ve konu açıklaması içeren modern kartlar.
.Favoriler: Filmlerin favorilere eklenip çıkarılması ve ayrı bir ekranda listelenmesi.
.Film Arama: Gerçek zamanlı olarak film adı, yönetmen veya kategoriye göre arama.
.Glide Kütüphanesi: İnternet üzerinden afiş görsellerinin yüklenmesi.
Bu proje ile aşağıdaki ileri düzey Android konularını öğreneceksiniz:
.HashMap & Static Veri Yönetimi: Kayıtlı kullanıcıların HashMap<String, String[]> yapısında saklanması.
.Intent & Activity Yönetimi: Ekranlar arası geçiş ve giriş/çıkış akışı.
.Glide Image Loading: URL'den afiş yükleme, placeholder ve hata görseli yönetimi.
.Programmatic UI: XML yerine Java kodu ile arayüz oluşturma (LinearLayout, FrameLayout, ImageView).
.Material Design: MaterialCardView, MaterialButton ve modern renk sistemi kullanımı.
.ScrollView & OverScrollMode: Uzun listelerin kaydırılabilir yapıda sunulması.
.Lambda Expressions: onClick ve Glide callback'lerinde kısa lambda syntax kullanımı.
.Local & Remote Resource: Drawable klasöründen yerel görseller ve URL'den uzak görseller yükleme.
Uygulama akışı şu şekildedir:
1.Kayıt: Kullanıcı ad, e-posta ve şifre girerek hesap oluşturur. Bilgiler SharedData.registeredUsers HashMap'ine kaydedilir.
2.Giriş: Kayıtlı e-posta ve şifre ile doğrulama yapılır, SharedData.loggedInEmail set edilir.
3.Ana Sayfa: Giriş yapan kullanıcının avatarı, adı ve e-postası gösterilir. Dört ana buton menüye erişim sağlar.
4.Filmler: Türkçe veya Yabancı kategori seçimi yapılır, afiş + bilgi kartları listelenir.
5.Favoriler: ❤️ butonuna tıklanan filmler SharedData.favoriteMovies listesine eklenir, ayrı ekranda görüntülenir.
6.Arama: Gerçek zamanlı TextWatcher ile tüm filmler içinde arama yapılır.
7.Kullanıcılar: Tüm kayıtlı kullanıcılar listelenir, aktif kullanıcı "(Sen)" etiketi ile gösterilir.
8.Çıkış: SharedData.loggedInEmail sıfırlanır, LoginActivity'e yönlendirilir.
Kullanıcılar HashMap yapısında saklanır. Giriş sırasında e-posta ve şifre kontrolü yapılır:
// Kayıt
SharedData.registeredUsers.put(email, new String[]{name, password});
// Giriş doğrulama
String[] userData = SharedData.registeredUsers.get(email);
if (userData == null) {
Toast.makeText(this, "Kullanıcı bulunamadı!", Toast.LENGTH_SHORT).show();
return;
}
if (!userData[1].equals(password)) {
Toast.makeText(this, "Şifre yanlış!", Toast.LENGTH_SHORT).show();
return;
}
SharedData.loggedInEmail = email;
Kullanıcı bilgileri, oturum durumu ve favoriler tek bir static sınıfta tutulur:
public class SharedData {
// Kayıtlı kullanıcılar: email -> [name, password]
public static HashMap<String, String[]> registeredUsers = new HashMap<>();
// Giriş yapan kullanıcı
public static String loggedInEmail = null;
// Favori filmler
public static ArrayList<String> favoriteMovies = new ArrayList<>();
}
Her film kartında afiş ImageView'e Glide ile yüklenir. Yerel drawable veya internet URL'si desteklenir:
// URL'den yükle
Glide.with(ctx)
.load(movie.posterUrl)
.transition(DrawableTransitionOptions.withCrossFade(400))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(new ColorDrawable(movie.posterColor))
.error(new ColorDrawable(movie.posterColor))
.into(posterImg);
// Yerel drawable'dan yükle
int resId = ctx.getResources().getIdentifier(
fileName, "drawable", ctx.getPackageName());
Glide.with(ctx).load(resId).into(posterImg);
Film kartları XML yerine Java kodu ile oluşturulur. Afiş üstüne gradient overlay ve favori butonu yerleştirilir:
// FrameLayout ile afiş + overlay üst üste
FrameLayout posterFrame = new FrameLayout(ctx);
posterFrame.setLayoutParams(new LinearLayout.LayoutParams(
MATCH_PARENT, dp(ctx, 180)));
posterFrame.addView(posterImg); // Afiş
posterFrame.addView(gradient); // Karartma overlay
posterFrame.addView(badge); // Kategori etiketi
posterFrame.addView(btnFav); // Favori butonu
Favori ekleme/çıkarma işlemi SharedData üzerinden yapılır, buton anlık güncellenir:
btnFav.setOnClickListener(v -> {
if (SharedData.favoriteMovies.contains(movie.title)) {
SharedData.favoriteMovies.remove(movie.title);
btnFav.setText("????");
} else {
SharedData.favoriteMovies.add(movie.title);
btnFav.setText("❤️");
}
});
TextWatcher ile her tuş basışında film listesi filtrelenir:
editSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int st, int b, int c) {
String query = s.toString().trim().toLowerCase();
ArrayList<Movie> filtered = new ArrayList<>();
for (Movie m : allMovies) {
if (m.title.toLowerCase().contains(query)
|| m.director.toLowerCase().contains(query)
|| m.category.toLowerCase().contains(query)) {
filtered.add(m);
}
}
showResults(filtered);
}
// ...
});
Projede kullanılan xml ve java kodları aşağıdaki gösterilmiştir.
Bu ekran kullanıcı kayıt ve doğrulama süreçlerini yönetir.
LoginActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class LoginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
EditText editTextEmail = findViewById(R.id.editTextLoginEmail);
EditText editTextPassword = findViewById(R.id.editTextLoginPassword);
TextView buttonLogin = findViewById(R.id.buttonLogin);
TextView textViewRegister = findViewById(R.id.textViewGoRegister);
buttonLogin.setOnClickListener(v -> {
String email = editTextEmail.getText().toString().trim();
String password = editTextPassword.getText().toString().trim();
if (email.isEmpty()) {
Toast.makeText(this, "E-posta boş olamaz!", Toast.LENGTH_SHORT).show();
editTextEmail.requestFocus();
return;
}
if (password.isEmpty()) {
Toast.makeText(this, "Şifre boş olamaz!", Toast.LENGTH_SHORT).show();
editTextPassword.requestFocus();
return;
}
String[] userData = SharedData.registeredUsers.get(email);
if (userData == null) {
Toast.makeText(this, "Bu e-posta ile kayıtlı kullanıcı bulunamadı!", Toast.LENGTH_SHORT).show();
return;
}
if (!userData[1].equals(password)) {
Toast.makeText(this, "Şifre yanlış!", Toast.LENGTH_SHORT).show();
return;
}
// Giriş başarılı
SharedData.loggedInEmail = email;
Intent intent = new Intent(LoginActivity.this, SecondActivity.class);
startActivity(intent);
});
textViewRegister.setOnClickListener(v -> {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
});
}
}
activity_login.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="httpackage com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class LoginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
EditText editTextEmail = findViewById(R.id.editTextLoginEmail);
EditText editTextPassword = findViewById(R.id.editTextLoginPassword);
TextView buttonLogin = findViewById(R.id.buttonLogin);
TextView textViewRegister = findViewById(R.id.textViewGoRegister);
buttonLogin.setOnClickListener(v -> {
String email = editTextEmail.getText().toString().trim();
String password = editTextPassword.getText().toString().trim();
if (email.isEmpty()) {
Toast.makeText(this, "E-posta boş olamaz!", Toast.LENGTH_SHORT).show();
editTextEmail.requestFocus();
return;
}
if (password.isEmpty()) {
Toast.makeText(this, "Şifre boş olamaz!", Toast.LENGTH_SHORT).show();
editTextPassword.requestFocus();
return;
}
String[] userData = SharedData.registeredUsers.get(email);
if (userData == null) {
Toast.makeText(this, "Bu e-posta ile kayıtlı kullanıcı bulunamadı!", Toast.LENGTH_SHORT).show();
return;
}
if (!userData[1].equals(password)) {
Toast.makeText(this, "Şifre yanlış!", Toast.LENGTH_SHORT).show();
return;
}
// Giriş başarılı
SharedData.loggedInEmail = email;
Intent intent = new Intent(LoginActivity.this, SecondActivity.class);
startActivity(intent);
});
textViewRegister.setOnClickListener(v -> {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
});
}
}
p://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
android:background="@drawable/bg_main"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="24dp"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hoşgeldiniz"
android:textSize="36sp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:layout_marginBottom="40dp" />
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="16dp"
app:cardElevation="8dp"
android:layout_marginBottom="32dp"
app:cardBackgroundColor="@android:color/white">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="24dp">
<EditText
android:id="@+id/editTextTextPersonName"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@android:color/transparent"
android:layout_marginBottom="12dp"
android:hint="Ad"
android:inputType="textPersonName"
android:paddingStart="8dp"
android:paddingEnd="8dp"/>
<View android:layout_width="match_parent" android:layout_height="1dp" android:background="#E0E0E0" android:layout_marginBottom="16dp" />
<EditText
android:id="@+id/editTextTextEmailAddress"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@android:color/transparent"
android:layout_marginBottom="12dp"
android:hint="E-posta"
android:inputType="textEmailAddress"
android:paddingStart="8dp"
android:paddingEnd="8dp"/>
<View android:layout_width="match_parent" android:layout_height="1dp" android:background="#E0E0E0" android:layout_marginBottom="16dp" />
<EditText
android:id="@+id/editTextTextPassword"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@android:color/transparent"
android:layout_marginBottom="12dp"
android:hint="Şifre"
android:inputType="textPassword"
android:paddingStart="8dp"
android:paddingEnd="8dp"/>
<View android:layout_width="match_parent" android:layout_height="1dp" android:background="#E0E0E0" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.button.MaterialButton
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="Giriş Yap"
android:textSize="18sp"
android:textStyle="bold"
app:cornerRadius="12dp"
android:backgroundTint="#5B86E5"/>
</LinearLayout>
</ScrollView>
Uygulamanın başlangıç ekranıdır. Kullanıcı kayıtlı e-posta ve şifresi ile giriş yapar. Kayıtlı değilse Kayıt ekranına yönlendirilir.
RegisterActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class RegisterActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
EditText editTextName = findViewById(R.id.editTextRegisterName);
EditText editTextEmail = findViewById(R.id.editTextRegisterEmail);
EditText editTextPassword = findViewById(R.id.editTextRegisterPassword);
TextView buttonRegister = findViewById(R.id.buttonRegister);
TextView textViewLogin = findViewById(R.id.textViewGoLogin);
buttonRegister.setOnClickListener(v -> {
String name = editTextName.getText().toString().trim();
String email = editTextEmail.getText().toString().trim();
String password = editTextPassword.getText().toString().trim();
if (name.isEmpty()) {
Toast.makeText(this, "Ad boş olamaz!", Toast.LENGTH_SHORT).show();
editTextName.requestFocus();
return;
}
if (email.isEmpty()) {
Toast.makeText(this, "E-posta boş olamaz!", Toast.LENGTH_SHORT).show();
editTextEmail.requestFocus();
return;
}
if (!android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
Toast.makeText(this, "Geçerli bir e-posta giriniz!", Toast.LENGTH_SHORT).show();
editTextEmail.requestFocus();
return;
}
if (password.isEmpty()) {
Toast.makeText(this, "Şifre boş olamaz!", Toast.LENGTH_SHORT).show();
editTextPassword.requestFocus();
return;
}
if (password.length() < 4) {
Toast.makeText(this, "Şifre en az 4 karakter olmalı!", Toast.LENGTH_SHORT).show();
editTextPassword.requestFocus();
return;
}
if (SharedData.registeredUsers.containsKey(email)) {
Toast.makeText(this, "Bu e-posta zaten kayıtlı!", Toast.LENGTH_SHORT).show();
return;
}
// Kayıt yap: email -> [name, password]
SharedData.registeredUsers.put(email, new String[]{name, password});
Toast.makeText(this, "Kayıt başarılı! Giriş yapabilirsiniz.", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
});
textViewLogin.setOnClickListener(v -> finish());
}
}
activity_register.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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="match_parent"
android:fillViewport="true"
android:background="@drawable/bg_main">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="28dp"
android:paddingEnd="28dp"
android:paddingTop="64dp"
android:paddingBottom="40dp"
android:gravity="center_horizontal">
<!-- İkon -->
<TextView
android:layout_width="72dp"
android:layout_height="72dp"
android:text="????"
android:textSize="36sp"
android:gravity="center"
android:background="@drawable/bg_logo_circle"
android:layout_marginBottom="24dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CineApp"
android:textSize="32sp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:letterSpacing="0.05"
android:layout_marginBottom="6dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ücretsiz hesap oluşturun"
android:textSize="14sp"
android:textColor="#B0BEC5"
android:layout_marginBottom="48dp"/>
<!-- Form kartı -->
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardCornerRadius="20dp"
app:cardElevation="0dp"
app:cardBackgroundColor="#FFFFFF"
android:layout_marginBottom="20dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="28dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kayıt Ol"
android:textSize="20sp"
android:textColor="@color/brand_primary"
android:textStyle="bold"
android:layout_marginBottom="6dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Bilgilerinizi doldurun"
android:textSize="13sp"
android:textColor="@color/text_secondary"
android:layout_marginBottom="28dp"/>
<!-- Ad -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ADINIZ"
android:textSize="11sp"
android:textColor="@color/text_secondary"
android:textStyle="bold"
android:letterSpacing="0.1"
android:layout_marginBottom="8dp"/>
<EditText
android:id="@+id/editTextRegisterName"
android:layout_width="match_parent"
android:layout_height="52dp"
android:hint="Ad Soyad"
android:inputType="textPersonName"
android:textColor="@color/text_primary"
android:textColorHint="@color/text_hint"
android:textSize="15sp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:background="@drawable/bg_input_field"
android:layout_marginBottom="20dp"/>
<!-- E-posta -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="E-POSTA"
android:textSize="11sp"
android:textColor="@color/text_secondary"
android:textStyle="bold"
android:letterSpacing="0.1"
android:layout_marginBottom="8dp"/>
<EditText
android:id="@+id/editTextRegisterEmail"
android:layout_width="match_parent"
android:layout_height="52dp"
android:hint="ornek@mail.com"
android:inputType="textEmailAddress"
android:textColor="@color/text_primary"
android:textColorHint="@color/text_hint"
android:textSize="15sp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:background="@drawable/bg_input_field"
android:layout_marginBottom="20dp"/>
<!-- Şifre -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="ŞİFRE"
android:textSize="11sp"
android:textColor="@color/text_secondary"
android:textStyle="bold"
android:letterSpacing="0.1"
android:layout_marginBottom="8dp"/>
<EditText
android:id="@+id/editTextRegisterPassword"
android:layout_width="match_parent"
android:layout_height="52dp"
android:hint="En az 4 karakter"
android:inputType="textPassword"
android:textColor="@color/text_primary"
android:textColorHint="@color/text_hint"
android:textSize="15sp"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:background="@drawable/bg_input_field"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<!-- Kayıt butonu -->
<com.google.android.material.button.MaterialButton
android:id="@+id/buttonRegister"
android:layout_width="match_parent"
android:layout_height="56dp"
android:text="Hesap Oluştur"
android:textColor="#FFFFFF"
android:textSize="16sp"
android:textStyle="bold"
android:letterSpacing="0.05"
app:cornerRadius="14dp"
android:backgroundTint="@color/brand_accent"
android:layout_marginBottom="24dp"/>
<!-- Giriş linki -->
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Zaten hesabın var mı? "
android:textColor="#B0BEC5"
android:textSize="14sp"/>
<TextView
android:id="@+id/textViewGoLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Giriş Yap"
android:textColor="@color/brand_gold"
android:textSize="14sp"
android:textStyle="bold"
android:clickable="true"
android:focusable="true"/>
</LinearLayout>
</LinearLayout>
</ScrollView>
Giriş yapan kullanıcının profil bilgilerini gösterir ve dört ana bölüme (Filmler, Arama, Favoriler, Kullanıcılar) yönlendirme yapar.
SecondActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
TextView textViewName = findViewById(R.id.textViewName);
TextView textViewEmail = findViewById(R.id.textViewEmail);
TextView textViewAvatar = findViewById(R.id.textViewAvatar);
String email = SharedData.loggedInEmail;
String name = "";
if (email != null && SharedData.registeredUsers.containsKey(email)) {
name = SharedData.registeredUsers.get(email)[0];
}
textViewName.setText(name);
textViewEmail.setText(email != null ? email : "");
// Avatar: ismin ilk harfi
textViewAvatar.setText(name.isEmpty() ? "?" : String.valueOf(name.charAt(0)).toUpperCase());
// Kart tıklamaları
findViewById(R.id.buttonFilm).setOnClickListener(v ->
startActivity(new Intent(this, ThirdActivity.class)));
findViewById(R.id.buttonSearch).setOnClickListener(v ->
startActivity(new Intent(this, SearchActivity.class)));
findViewById(R.id.buttonFavorites).setOnClickListener(v ->
startActivity(new Intent(this, FavoritesActivity.class)));
findViewById(R.id.buttonUsers).setOnClickListener(v ->
startActivity(new Intent(this, UsersActivity.class)));
findViewById(R.id.buttonLogout).setOnClickListener(v -> {
SharedData.loggedInEmail = null;
Intent intent = new Intent(this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finish();
});
}
}
activity_second.xml
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/bg_second">
<!-- Profil alanı -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:paddingTop="52dp"
android:paddingBottom="28dp"
android:paddingStart="24dp"
android:paddingEnd="24dp">
<!-- Avatar -->
<TextView
android:id="@+id/textViewAvatar"
android:layout_width="72dp"
android:layout_height="72dp"
android:gravity="center"
android:textSize="28sp"
android:textColor="#FFFFFF"
android:textStyle="bold"
android:background="@drawable/bg_avatar"
android:layout_marginBottom="14dp"/>
<TextView
android:id="@+id/textViewName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:textSize="20sp"
android:textStyle="bold"
android:layout_marginBottom="4dp"/>
<TextView
android:id="@+id/textViewEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#90CAF9"
android:textSize="13sp"/>
</LinearLayout>
<!-- Menü -->
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="18dp"
android:paddingEnd="18dp"
android:paddingBottom="24dp">
<!-- Satır 1: Filmler + Arama -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2"
android:layout_marginBottom="12dp">
<com.google.android.material.card.MaterialCardView
android:id="@+id/buttonFilm"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_weight="1"
android:layout_marginEnd="6dp"
android:clickable="true"
android:focusable="true"
app:cardCornerRadius="16dp"
app:cardElevation="0dp"
app:cardBackgroundColor="#E94560">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="12dp">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="????" android:textSize="28sp" android:layout_marginBottom="6dp"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Filmler" android:textColor="#FFFFFF" android:textSize="13sp"
android:textStyle="bold"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:id="@+id/buttonSearch"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_weight="1"
android:layout_marginStart="6dp"
android:clickable="true"
android:focusable="true"
app:cardCornerRadius="16dp"
app:cardElevation="0dp"
app:cardBackgroundColor="#0F3460">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="12dp">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="????" android:textSize="28sp" android:layout_marginBottom="6dp"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Film Ara" android:textColor="#FFFFFF" android:textSize="13sp"
android:textStyle="bold"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
<!-- Satır 2: Favoriler + Kullanıcılar -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="2"
android:layout_marginBottom="12dp">
<com.google.android.material.card.MaterialCardView
android:id="@+id/buttonFavorites"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_weight="1"
android:layout_marginEnd="6dp"
android:clickable="true"
android:focusable="true"
app:cardCornerRadius="16dp"
app:cardElevation="0dp"
app:cardBackgroundColor="#F5A623">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="12dp">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="❤️" android:textSize="28sp" android:layout_marginBottom="6dp"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Favoriler" android:textColor="#FFFFFF" android:textSize="13sp"
android:textStyle="bold"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<com.google.android.material.card.MaterialCardView
android:id="@+id/buttonUsers"
android:layout_width="0dp"
android:layout_height="100dp"
android:layout_weight="1"
android:layout_marginStart="6dp"
android:clickable="true"
android:focusable="true"
app:cardCornerRadius="16dp"
app:cardElevation="0dp"
app:cardBackgroundColor="#16A085">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center"
android:padding="12dp">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="????" android:textSize="28sp" android:layout_marginBottom="6dp"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Kullanıcılar" android:textColor="#FFFFFF" android:textSize="13sp"
android:textStyle="bold"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
<!-- Çıkış -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/buttonLogout"
android:layout_width="match_parent"
android:layout_height="56dp"
android:clickable="true"
android:focusable="true"
app:cardCornerRadius="16dp"
app:cardElevation="0dp"
app:cardBackgroundColor="#1E2A3A">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Çıkış Yap"
android:textColor="#90A4AE"
android:textSize="14sp"
android:textStyle="bold"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</ScrollView>
</LinearLayout>
Türkçe veya Yabancı yapım kategorisi seçildiğinde ilgili film listesine yönlendirir.
ThirdActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
public class ThirdActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
findViewById(R.id.buttonTurkish).setOnClickListener(v ->
startActivity(new Intent(this, TurkishMoviesActivity.class)));
findViewById(R.id.buttonForeign).setOnClickListener(v ->
startActivity(new Intent(this, ForeignMoviesActivity.class)));
findViewById(R.id.buttonBackToSecond).setOnClickListener(v -> finish());
}
}
activity_third.xml
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/bg_third">
<!-- Başlık alanı -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="28dp"
android:paddingEnd="28dp"
android:paddingTop="56dp"
android:paddingBottom="40dp"
android:gravity="center_horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="????"
android:textSize="48sp"
android:layout_marginBottom="16dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kategori Seç"
android:textColor="#FFFFFF"
android:textSize="28sp"
android:textStyle="bold"
android:layout_marginBottom="8dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hangi tür film izlemek istiyorsunuz?"
android:textColor="#B0BEC5"
android:textSize="14sp"/>
</LinearLayout>
<!-- Seçim kartları -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="24dp"
android:paddingEnd="24dp">
<!-- Türkçe -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/buttonTurkish"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginBottom="16dp"
android:clickable="true"
android:focusable="true"
app:cardCornerRadius="18dp"
app:cardElevation="0dp"
app:cardBackgroundColor="#E94560">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingStart="24dp"
android:paddingEnd="24dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="????????"
android:textSize="28sp"
android:layout_marginEnd="16dp"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Türkçe Yapımlar"
android:textColor="#FFFFFF"
android:textSize="17sp"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Yerli film ve diziler"
android:textColor="#FFCCD3"
android:textSize="12sp"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="›"
android:textColor="#FFFFFF"
android:textSize="28sp"
android:textStyle="bold"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<!-- Yabancı -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/buttonForeign"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginBottom="16dp"
android:clickable="true"
android:focusable="true"
app:cardCornerRadius="18dp"
app:cardElevation="0dp"
app:cardBackgroundColor="#0F3460">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingStart="24dp"
android:paddingEnd="24dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="????"
android:textSize="28sp"
android:layout_marginEnd="16dp"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Yabancı Yapımlar"
android:textColor="#FFFFFF"
android:textSize="17sp"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Uluslararası yapımlar"
android:textColor="#AACCFF"
android:textSize="12sp"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="›"
android:textColor="#FFFFFF"
android:textSize="28sp"
android:textStyle="bold"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
<!-- Geri -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/buttonBackToSecond"
android:layout_width="match_parent"
android:layout_height="60dp"
android:clickable="true"
android:focusable="true"
app:cardCornerRadius="18dp"
app:cardElevation="0dp"
app:cardBackgroundColor="#1E1E3A">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="← "
android:textColor="#B0BEC5"
android:textSize="16sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Ana Sayfaya Dön"
android:textColor="#B0BEC5"
android:textSize="15sp"
android:textStyle="bold"/>
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</LinearLayout>
SharedData.favoriteMovies listesindeki filmleri ekranda gösterir. onResume() ile her açılışta liste yenilenir. Favoriden çıkarma işlemi anında listeyi günceller.
FavoritesActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
public class FavoritesActivity extends AppCompatActivity {
private LinearLayout favoritesContainer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_favorites);
favoritesContainer = findViewById(R.id.favoritesContainer);
buildList();
}
@Override
protected void onResume() {
super.onResume();
buildList();
}
private void buildList() {
favoritesContainer.removeAllViews();
ArrayList<String> favTitles = new ArrayList<>(SharedData.favoriteMovies);
ArrayList<Movie> allMovies = MovieData.getAllMovies();
if (favTitles.isEmpty()) {
TextView empty = new TextView(this);
empty.setText("Henüz favori film eklemediniz.\n\nFilm kartlarındaki\n???? Favoriye Ekle\nbutonuna basın.");
empty.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
empty.setTextColor(Color.parseColor("#9E9E9E"));
empty.setGravity(Gravity.CENTER);
empty.setPadding(0, dp(48), 0, 0);
empty.setLineSpacing(dp(4), 1f);
favoritesContainer.addView(empty);
return;
}
for (String title : favTitles) {
Movie movie = null;
for (Movie m : allMovies) {
if (m.title.equals(title)) { movie = m; break; }
}
if (movie == null) continue;
favoritesContainer.addView(MovieCardHelper.buildCard(this, movie, (m, isFav) -> {
if (!isFav) buildList();
}));
}
}
private int dp(int v) {
return (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, v, getResources().getDisplayMetrics());
}
}
activity_favorites.xml
<?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="#F4F6F8">
<!-- Üst bar -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#FFFFFF"
android:padding="16dp"
android:elevation="4dp"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="❤️"
android:textSize="22sp"
android:layout_marginEnd="10dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Favori Filmlerim"
android:textSize="18sp"
android:textColor="#E94560"
android:textStyle="bold"/>
</LinearLayout>
<!-- Film listesi -->
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="false">
<LinearLayout
android:id="@+id/favoritesContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="14dp"/>
</ScrollView>
</LinearLayout>
Tüm filmler başlangıçta gösterilir. TextWatcher ile kullanıcı her harf girdiğinde filterMovies() çağrılır ve sonuçlar anlık güncellenir. Başlık, yönetmen, kategori ve açıklama içinde arama yapar.
SearchActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.view.Gravity;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
public class SearchActivity extends AppCompatActivity {
private LinearLayout resultsContainer;
private ArrayList<Movie> allMovies;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
allMovies = MovieData.getAllMovies();
resultsContainer = findViewById(R.id.searchResultsContainer);
EditText editSearch = findViewById(R.id.editSearch);
showResults(allMovies);
editSearch.addTextChangedListener(new TextWatcher() {
@Override public void beforeTextChanged(CharSequence s, int st, int c, int a) {}
@Override public void onTextChanged(CharSequence s, int st, int b, int c) {
filterMovies(s.toString().trim());
}
@Override public void afterTextChanged(Editable s) {}
});
}
private void filterMovies(String q) {
if (q.isEmpty()) { showResults(allMovies); return; }
String lower = q.toLowerCase();
ArrayList<Movie> res = new ArrayList<>();
for (Movie m : allMovies) {
if (m.title.toLowerCase().contains(lower)
|| m.director.toLowerCase().contains(lower)
|| m.category.toLowerCase().contains(lower)
|| m.description.toLowerCase().contains(lower)) {
res.add(m);
}
}
showResults(res);
}
private void showResults(ArrayList<Movie> movies) {
resultsContainer.removeAllViews();
if (movies.isEmpty()) {
TextView empty = new TextView(this);
empty.setText("Sonuç bulunamadı.");
empty.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
empty.setTextColor(Color.parseColor("#9E9E9E"));
empty.setGravity(Gravity.CENTER);
empty.setPadding(0, dp(32), 0, 0);
resultsContainer.addView(empty);
return;
}
TextView countTv = new TextView(this);
countTv.setText(movies.size() + " sonuç");
countTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);
countTv.setTextColor(Color.parseColor("#9E9E9E"));
countTv.setPadding(0, 0, 0, dp(8));
resultsContainer.addView(countTv);
for (Movie movie : movies) {
resultsContainer.addView(MovieCardHelper.buildCard(this, movie, null));
}
}
private int dp(int v) {
return (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, v, getResources().getDisplayMetrics());
}
}
activity_search.xml
<?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="#F4F6F8">
<!-- Arama çubuğu -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#FFFFFF"
android:padding="16dp"
android:elevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_marginBottom="12dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="????"
android:textSize="22sp"
android:layout_marginEnd="10dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Film / Dizi Ara"
android:textSize="18sp"
android:textColor="#5B86E5"
android:textStyle="bold"/>
</LinearLayout>
<EditText
android:id="@+id/editSearch"
android:layout_width="match_parent"
android:layout_height="52dp"
android:hint="Film adı, yönetmen veya tür ara..."
android:inputType="text"
android:textColor="#212121"
android:textColorHint="#AAAAAA"
android:textSize="15sp"
android:paddingStart="14dp"
android:paddingEnd="14dp"
android:background="@drawable/bg_input_field"/>
</LinearLayout>
<!-- Sonuçlar -->
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="false">
<LinearLayout
android:id="@+id/searchResultsContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="14dp"/>
</ScrollView>
</LinearLayout>
SharedData.registeredUsers HashMap'indeki tüm kullanıcıları listeler. Aktif kullanıcı "(Sen)" etiketi ile vurgulanır. Her kullanıcı için adının ilk harfinden avatar oluşturulur.
UsersActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.google.android.material.card.MaterialCardView;
import java.util.Map;
public class UsersActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_users);
LinearLayout usersContainer = findViewById(R.id.usersContainer);
if (SharedData.registeredUsers.isEmpty()) {
TextView empty = new TextView(this);
empty.setText("Henüz kayıtlı kullanıcı yok.");
empty.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
empty.setTextColor(Color.parseColor("#9E9E9E"));
empty.setGravity(Gravity.CENTER);
empty.setPadding(0, dp(48), 0, 0);
usersContainer.addView(empty);
return;
}
int index = 1;
for (Map.Entry<String, String[]> entry : SharedData.registeredUsers.entrySet()) {
String email = entry.getKey();
String name = entry.getValue()[0];
boolean isCurrentUser = email.equals(SharedData.loggedInEmail);
// Kart
MaterialCardView card = new MaterialCardView(this);
LinearLayout.LayoutParams cp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
cp.setMargins(0, 0, 0, dp(12));
card.setLayoutParams(cp);
card.setRadius(dp(14));
card.setCardElevation(dp(3));
card.setCardBackgroundColor(isCurrentUser
? Color.parseColor("#EBF5FB") : Color.WHITE);
LinearLayout row = new LinearLayout(this);
row.setOrientation(LinearLayout.HORIZONTAL);
row.setPadding(dp(16), dp(16), dp(16), dp(16));
row.setGravity(Gravity.CENTER_VERTICAL);
// Avatar
TextView avatar = new TextView(this);
avatar.setText(name.isEmpty() ? "?" : String.valueOf(name.charAt(0)).toUpperCase());
avatar.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
avatar.setTextColor(Color.WHITE);
avatar.setTypeface(null, Typeface.BOLD);
avatar.setGravity(Gravity.CENTER);
avatar.setBackgroundColor(isCurrentUser
? Color.parseColor("#E94560") : Color.parseColor("#78909C"));
LinearLayout.LayoutParams avP = new LinearLayout.LayoutParams(dp(44), dp(44));
avP.setMarginEnd(dp(14));
avatar.setLayoutParams(avP);
// Bilgi
LinearLayout info = new LinearLayout(this);
info.setOrientation(LinearLayout.VERTICAL);
info.setLayoutParams(new LinearLayout.LayoutParams(0,
LinearLayout.LayoutParams.WRAP_CONTENT, 1f));
TextView tvName = new TextView(this);
tvName.setText(name + (isCurrentUser ? " (Sen)" : ""));
tvName.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
tvName.setTextColor(Color.parseColor("#212121"));
tvName.setTypeface(null, Typeface.BOLD);
TextView tvEmail = new TextView(this);
tvEmail.setText(email);
tvEmail.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
tvEmail.setTextColor(Color.parseColor("#757575"));
info.addView(tvName);
info.addView(tvEmail);
// Numara
TextView tvNum = new TextView(this);
tvNum.setText("#" + index);
tvNum.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
tvNum.setTextColor(Color.parseColor("#BDBDBD"));
row.addView(avatar);
row.addView(info);
row.addView(tvNum);
card.addView(row);
usersContainer.addView(card);
index++;
}
}
private int dp(int v) {
return (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, v, getResources().getDisplayMetrics());
}
}
activity_users.xml
<?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="#F4F6F8">
<!-- Üst bar -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#FFFFFF"
android:padding="16dp"
android:elevation="4dp"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="????"
android:textSize="22sp"
android:layout_marginEnd="10dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Kayıtlı Kullanıcılar"
android:textSize="18sp"
android:textColor="#16A085"
android:textStyle="bold"/>
</LinearLayout>
<!-- Kullanıcı listesi -->
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="false">
<LinearLayout
android:id="@+id/usersContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="14dp"/>
</ScrollView>
</LinearLayout>
Tüm ekranlarda kullanılan film kartını oluşturur. Afiş üzerine gradient overlay, kategori badge ve favori butonu yerleştirilir. local: prefix ile yerel drawable, https:// ile internet'ten görsel yüklenir.
MovieCardHelperActivity.java
package com.example.myapplication;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.util.TypedValue;
import android.view.Gravity;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
import com.google.android.material.card.MaterialCardView;
public class MovieCardHelper {
public interface OnFavoriteChanged {
void onChanged(Movie movie, boolean isFavorite);
}
public static MaterialCardView buildCard(Context ctx, Movie movie,
OnFavoriteChanged listener) {
// ── Dış kart ────────────────────────────────────────────
MaterialCardView card = new MaterialCardView(ctx);
LinearLayout.LayoutParams cp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
cp.setMargins(0, 0, 0, dp(ctx, 14));
card.setLayoutParams(cp);
card.setRadius(dp(ctx, 16));
card.setCardElevation(dp(ctx, 4));
card.setCardBackgroundColor(Color.WHITE);
LinearLayout content = new LinearLayout(ctx);
content.setOrientation(LinearLayout.VERTICAL);
content.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
// ── Afiş FrameLayout (resim + overlay) ──────────────────
FrameLayout posterFrame = new FrameLayout(ctx);
posterFrame.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
dp(ctx, 180)));
// Afiş resmi
ImageView posterImg = new ImageView(ctx);
posterImg.setLayoutParams(new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT));
posterImg.setScaleType(ImageView.ScaleType.CENTER_CROP);
posterImg.setBackgroundColor(movie.posterColor);
// local: prefix = drawable klasöründen yükle, yoksa URL'den yükle
if (movie.posterUrl != null && movie.posterUrl.startsWith("local:")) {
String fileName = movie.posterUrl.substring(6);
int resId = ctx.getResources().getIdentifier(
fileName, "drawable", ctx.getPackageName());
if (resId != 0) {
Glide.with(ctx).load(resId)
.transition(DrawableTransitionOptions.withCrossFade(400))
.placeholder(new android.graphics.drawable.ColorDrawable(movie.posterColor))
.error(new android.graphics.drawable.ColorDrawable(movie.posterColor))
.into(posterImg);
} else {
posterImg.setBackgroundColor(movie.posterColor);
}
} else {
Glide.with(ctx)
.load(movie.posterUrl)
.transition(DrawableTransitionOptions.withCrossFade(400))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.placeholder(new android.graphics.drawable.ColorDrawable(movie.posterColor))
.error(new android.graphics.drawable.ColorDrawable(movie.posterColor))
.into(posterImg);
}
// Gradient overlay (alt kısım karartma)
android.view.View gradient = new android.view.View(ctx);
FrameLayout.LayoutParams gradP = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, dp(ctx, 80));
gradP.gravity = Gravity.BOTTOM;
gradient.setLayoutParams(gradP);
gradient.setBackground(buildGradient(ctx));
// Kategori badge (sol alt)
TextView badge = new TextView(ctx);
badge.setText(movie.category.equals("Türkçe") ? "???????? Türkçe" : "???? Yabancı");
badge.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10);
badge.setTextColor(Color.WHITE);
badge.setTypeface(null, Typeface.BOLD);
badge.setPadding(dp(ctx,7), dp(ctx,3), dp(ctx,7), dp(ctx,3));
badge.setBackgroundColor(movie.category.equals("Türkçe")
? Color.parseColor("#CC E94560".replace(" ",""))
: Color.parseColor("#CC0F3460"));
FrameLayout.LayoutParams badgeP = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT);
badgeP.gravity = Gravity.BOTTOM | Gravity.START;
badgeP.setMargins(dp(ctx,10), 0, 0, dp(ctx,10));
badge.setLayoutParams(badgeP);
// Favori butonu (sağ üst)
boolean isFav = SharedData.favoriteMovies.contains(movie.title);
TextView btnFav = new TextView(ctx);
btnFav.setText(isFav ? "❤️" : "????");
btnFav.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
btnFav.setGravity(Gravity.CENTER);
btnFav.setPadding(dp(ctx,6), dp(ctx,6), dp(ctx,6), dp(ctx,6));
btnFav.setBackgroundColor(Color.parseColor("#99000000"));
FrameLayout.LayoutParams favBtnP = new FrameLayout.LayoutParams(
dp(ctx,40), dp(ctx,40));
favBtnP.gravity = Gravity.TOP | Gravity.END;
favBtnP.setMargins(0, dp(ctx,10), dp(ctx,10), 0);
btnFav.setLayoutParams(favBtnP);
btnFav.setClickable(true);
btnFav.setFocusable(true);
btnFav.setOnClickListener(v -> toggleFav(ctx, movie, btnFav, null, listener));
posterFrame.addView(posterImg);
posterFrame.addView(gradient);
posterFrame.addView(badge);
posterFrame.addView(btnFav);
// ── Bilgi bölümü ─────────────────────────────────────────
LinearLayout info = new LinearLayout(ctx);
info.setOrientation(LinearLayout.HORIZONTAL);
info.setPadding(dp(ctx,14), dp(ctx,12), dp(ctx,14), dp(ctx,12));
info.setBackgroundColor(Color.WHITE);
// Sol: başlık + yönetmen + açıklama
LinearLayout textArea = new LinearLayout(ctx);
textArea.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams taP = new LinearLayout.LayoutParams(
0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f);
textArea.setLayoutParams(taP);
TextView tvTitle = new TextView(ctx);
tvTitle.setText(movie.title);
tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 15);
tvTitle.setTextColor(Color.parseColor("#1A1A2E"));
tvTitle.setTypeface(null, Typeface.BOLD);
tvTitle.setSingleLine(true);
tvTitle.setEllipsize(android.text.TextUtils.TruncateAt.END);
TextView tvDir = new TextView(ctx);
tvDir.setText(movie.director);
tvDir.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
tvDir.setTextColor(Color.parseColor("#6B7280"));
LinearLayout.LayoutParams dirP = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
dirP.setMargins(0, dp(ctx,2), 0, dp(ctx,4));
tvDir.setLayoutParams(dirP);
TextView tvDesc = new TextView(ctx);
tvDesc.setText(movie.description);
tvDesc.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
tvDesc.setTextColor(Color.parseColor("#6B7280"));
tvDesc.setMaxLines(2);
tvDesc.setEllipsize(android.text.TextUtils.TruncateAt.END);
textArea.addView(tvTitle);
textArea.addView(tvDir);
textArea.addView(tvDesc);
// Sağ: favori butonu (büyük, alt kısım)
LinearLayout favArea = new LinearLayout(ctx);
favArea.setOrientation(LinearLayout.VERTICAL);
favArea.setGravity(Gravity.CENTER);
LinearLayout.LayoutParams favAreaP = new LinearLayout.LayoutParams(
dp(ctx,44), LinearLayout.LayoutParams.MATCH_PARENT);
favAreaP.setMargins(dp(ctx,8), 0, 0, 0);
favArea.setLayoutParams(favAreaP);
TextView favLabel = new TextView(ctx);
favLabel.setText(isFav ? "❤️" : "????");
favLabel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);
favLabel.setGravity(Gravity.CENTER);
favLabel.setClickable(true);
favLabel.setFocusable(true);
favLabel.setOnClickListener(v -> toggleFav(ctx, movie, btnFav, favLabel, listener));
favArea.addView(favLabel);
info.addView(textArea);
info.addView(favArea);
content.addView(posterFrame);
content.addView(info);
card.addView(content);
return card;
}
private static void toggleFav(Context ctx, Movie movie,
TextView btnTop, TextView btnBottom,
OnFavoriteChanged listener) {
boolean nowFav = SharedData.favoriteMovies.contains(movie.title);
if (nowFav) {
SharedData.favoriteMovies.remove(movie.title);
if (btnTop != null) btnTop.setText("????");
if (btnBottom != null) btnBottom.setText("????");
Toast.makeText(ctx, movie.title + " favorilerden çıkarıldı", Toast.LENGTH_SHORT).show();
if (listener != null) listener.onChanged(movie, false);
} else {
SharedData.favoriteMovies.add(movie.title);
if (btnTop != null) btnTop.setText("❤️");
if (btnBottom != null) btnBottom.setText("❤️");
Toast.makeText(ctx, movie.title + " favorilere eklendi", Toast.LENGTH_SHORT).show();
if (listener != null) listener.onChanged(movie, true);
}
}
private static android.graphics.drawable.GradientDrawable buildGradient(Context ctx) {
android.graphics.drawable.GradientDrawable gd =
new android.graphics.drawable.GradientDrawable(
android.graphics.drawable.GradientDrawable.Orientation.BOTTOM_TOP,
new int[]{0xCC000000, 0x00000000});
return gd;
}
private static int dp(Context ctx, int val) {
return (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, val, ctx.getResources().getDisplayMetrics());
}
}
Artık sadece üç alan içerir. selectedMovies kaldırıldı çünkü uygulama artık favoriler sistemi kullanıyor.
ShardeDataActivity.java
package com.example.myapplication;
import java.util.ArrayList;
import java.util.HashMap;
public class SharedData {
// Kayıtlı kullanıcılar: email -> [name, password]
public static HashMap<String, String[]> registeredUsers = new HashMap<>();
// Şu an giriş yapmış kullanıcının emaili
public static String loggedInEmail = null;
// Favori filmler (film adları)
public static ArrayList<String> favoriteMovies = new ArrayList<>();
}
Uygulamadaki tüm film ve dizi verilerini tek bir merkezi listede tutar. Her film için başlık, yönetmen, açıklama, kategori, fallback rengi ve afiş URL'si tanımlanmıştır. Afiş görselleri iki farklı kaynaktan yüklenir.
MovieDataActivity.java
package com.example.myapplication;
import android.graphics.Color;
import java.util.ArrayList;
public class MovieData {
private static final String W = "https://upload.wikimedia.org/wikipedia/en";
private static final String WC = "https://upload.wikimedia.org/wikipedia/commons";
private static final String T = "https://media.themoviedb.org/t/p/w500";
public static ArrayList<Movie> getAllMovies() {
ArrayList<Movie> list = new ArrayList<>();
// ══════════════════════════════════════════════════
// TÜRKÇE YAPIMLAR
// ══════════════════════════════════════════════════
list.add(new Movie("Ayla",
"Can Ulkay",
"Kore Savaşı'nda bir Türk astsubayının bulup koruduğu Koreli yetim kız çocuğunun gerçek ve duygusal hikayesi.",
"Türkçe", Color.parseColor("#8B1A2A"),
W + "/8/89/Ayla_The_Daughter_of_War.jpg"));
list.add(new Movie("7. Koğuştaki Mucize",
"Mehmet Ada Öztekin",
"Zihinsel engelli bir babanın kızıyla haksız yere idam cezasıyla ayrı düşmesini anlatan duygu yüklü hikaye.",
"Türkçe", Color.parseColor("#1A4A7A"),
W + "/0/0d/7._Ko%C4%9Fu%C5%9Ftaki_Mucize.jpg"));
list.add(new Movie("G.O.R.A.",
"Ömer Faruk Sorak",
"Halı satıcısı Arif'in uzaylılar tarafından kaçırılarak G.O.R.A. gezegeninde yaşadığı komik maceralar.",
"Türkçe", Color.parseColor("#1A3A6A"),
W + "/1/17/G.O.R.A._%282004_movie_poster%29.jpg"));
list.add(new Movie("Eşkıya",
"Yavuz Turgul",
"35 yıl sonra hapisten çıkan Baran'ın ihanet eden dostunu bulmak için İstanbul'a gelmesi.",
"Türkçe", Color.parseColor("#3A1A5A"),
W + "/d/d2/E%C5%9Fk%C4%B1ya.jpg"));
list.add(new Movie("Kış Uykusu",
"Nuri Bilge Ceylan",
"Kapadokya'da otel işleten eski bir tiyatro oyuncusunun iç dünyasıyla yaşadığı derin çatışmalar. Cannes Palme d'Or ödüllü.",
"Türkçe", Color.parseColor("#3A3A4A"),
T + "/95j83qOqH3Ivz4RYkaSjGT0VSNr.jpg"));
list.add(new Movie("Bir Zamanlar Anadolu'da",
"Nuri Bilge Ceylan",
"Cinayet soruşturması kapsamında doktor, savcı ve polislerin Anadolu bozkırlarında ceset arama hikayesi.",
"Türkçe", Color.parseColor("#4A3020"),
T + "/bN84guFndgvtWIvFC7sTD8AAJDE.jpg"));
list.add(new Movie("Müslüm",
"Ketche & Can Ulkay",
"Arabesk müziğin efsanesi Müslüm Gürses'in zorluklarla dolu hayat hikayesi.",
"Türkçe", Color.parseColor("#7A1A1A"),
T + "/cbY2IlnNk85MqaPWgPZyJUD4vnz.jpg"));
list.add(new Movie("Ezel",
"Uluç Bayraktar",
"Yakın arkadaşları tarafından ihanete uğrayan Ömer'in yüzünü değiştirerek 'Ezel' adıyla intikam alma serüveni.",
"Türkçe", Color.parseColor("#5A1A8A"),
T + "/pHSjh4MINU2JnK7qQvjogQaX3wr.jpg"));
list.add(new Movie("Kurtlar Vadisi",
"Osman Sınav",
"Ali Candan'ın Polat Alemdar kimliğiyle mafya dünyasına sızdığı aksiyon dolu serüven.",
"Türkçe", Color.parseColor("#0A1A2A"),
T + "/aGi8EuXsf5bbM4O59Uu0pucLcT.jpg"));
list.add(new Movie("Şahsiyet",
"Onur Saylak",
"Alzheimer teşhisi konulan emekli bir adliye memurunun yıllarca ertelediği cinayetleri işlemeye başlaması.",
"Türkçe", Color.parseColor("#0A4A3A"),
T + "/OjvNOeB55tVymgybfWZOD7yXAF.jpg"));
list.add(new Movie("Diriliş: Ertuğrul",
"Metin Günay",
"Osmanlı İmparatorluğu'nun kuruluşuna öncülük eden Ertuğrul Bey'in Anadolu'daki destansı mücadelesi.",
"Türkçe", Color.parseColor("#5A2010"),
W + "/8/8e/Dirili%C5%9F_Ertu%C4%9Frul_S1.jpg"));
list.add(new Movie("Çukur",
"Sinan Öztürk",
"Çukur semtine hükmeden Koçovalı ailesinin güç, ihanet ve sevgi üzerine kurulu çarpıcı hikayesi.",
"Türkçe", Color.parseColor("#1A1A1A"),
T + "/fBXDSBDw5Zug6E2xTB265LzYVKz.jpg"));
list.add(new Movie("Karadayı",
"Uluç Bayraktar",
"1970'ler İstanbul'unda babasını kurtarmak için sahte kimlikle adliyeye sızan Mahir'in hikayesi.",
"Türkçe", Color.parseColor("#5A4A10"),
"https://upload.wikimedia.org/wikipedia/en/4/46/Karadayi_tv_series.jpg"));
list.add(new Movie("Behzat Ç.",
"Serdar Akar",
"Ankara Cinayet Büro Amiri Behzat Ç.'nin karmaşık cinayetler ve yozlaşmış sistemle mücadelesi.",
"Türkçe", Color.parseColor("#1A1A3A"),
T + "/aRqNQ5v2tvZ9ZRAXpYik0JamHkm.jpg"));
list.add(new Movie("Leyla ile Mecnun",
"Onur Ünlü",
"Beşik kertmesi yapılan Leyla ile Mecnun'un absürt ve komik aşk hikayesi.",
"Türkçe", Color.parseColor("#8A3A10"),
T + "/3jPLJJXbFabb29mOxZOK0xctcy6.jpg"));
list.add(new Movie("Sıla",
"Gül Oğuz",
"İstanbul'da büyüyen Sıla'nın töre gereği zorla evlendirilmesini anlatan dramatik hikaye.",
"Türkçe", Color.parseColor("#6A1010"),
T + "/fKdDCsuNIMvhTz5JCMA1UgTyPjv.jpg"));
// ══════════════════════════════════════════════════
// YABANCI YAPIMLAR
// ══════════════════════════════════════════════════
list.add(new Movie("Inception",
"Christopher Nolan",
"Rüya paylaşım teknolojisiyle insanların zihinlerine giren hırsızın bir zihne fikir yerleştirme görevi.",
"Yabancı", Color.parseColor("#0A2A5A"),
T + "/9gk7adHYeDvHkCSEqAvQNLV5Uge.jpg"));
list.add(new Movie("The Dark Knight",
"Christopher Nolan",
"Gotham'ı kaosa sürükleyen Joker'e karşı Batman'in verdiği amansız psikolojik mücadele.",
"Yabancı", Color.parseColor("#0A0A1A"),
T + "/qJ2tW6WMUDux911r6m7haRef0WH.jpg"));
list.add(new Movie("Interstellar",
"Christopher Nolan",
"Astronotların insanlık için yeni bir yuva bulmak amacıyla uzayın derinliklerine yolculuğu.",
"Yabancı", Color.parseColor("#0A1A3A"),
T + "/gEU2QniE6E77NI6lCU6MxlNBvIx.jpg"));
list.add(new Movie("The Godfather",
"Francis Ford Coppola",
"Corleone mafya ailesinin suç ve sadakat üzerine kurulu karanlık dünyası.",
"Yabancı", Color.parseColor("#1A1010"),
"https://media.themoviedb.org/t/p/w500/3bhkrj58Vtu7enYsRolD1fZdja1.jpg"));
list.add(new Movie("The Shawshank Redemption",
"Frank Darabont",
"Haksız yere hapse giren bankacının yıllarca umudunu yitirmeden mücadelesi.",
"Yabancı", Color.parseColor("#4A2A10"),
T + "/q6y0Go1tsGEsmtFryDOJo3dEmqu.jpg"));
list.add(new Movie("Breaking Bad",
"Vince Gilligan",
"Kanser teşhisi konulan kimya öğretmeninin uyuşturucu üretimine girmesi.",
"Yabancı", Color.parseColor("#0A3A1A"),
T + "/ggFHVNu6YYI5L9pCfOacjizRGt.jpg"));
list.add(new Movie("Game of Thrones",
"David Benioff & D.B. Weiss",
"Demir taht için savaşan soylu ailelerin entrikaları ve kuzeyden gelen büyük tehdit.",
"Yabancı", Color.parseColor("#1A1A2A"),
T + "/u3bZgnGQ9T01sWNhyveQz0wH0Hl.jpg"));
list.add(new Movie("Stranger Things",
"Duffer Kardeşler",
"Küçük bir kasabada kaybolan çocuğun ardından gizli deneyler ve doğaüstü güçlerin ortaya çıkması.",
"Yabancı", Color.parseColor("#0A0A2A"),
T + "/49WJfeN0moxb9IPfGn8AIqMGskD.jpg"));
list.add(new Movie("The Matrix",
"Wachowski Kardeşler",
"Neo'nun yaşadığı dünyanın aslında makineler tarafından yaratılmış bir simülasyon olduğunu keşfetmesi.",
"Yabancı", Color.parseColor("#0A1A0A"),
T + "/f89U3ADr1oiB1s9GkdPOEpXUk5H.jpg"));
list.add(new Movie("Pulp Fiction",
"Quentin Tarantino",
"İki tetikçi, bir boksör ve gangster eşinin birbiriyle kesişen şiddet ve kara mizah dolu hikayeleri.",
"Yabancı", Color.parseColor("#4A0A0A"),
T + "/d5iIlFn5s0ImszYzBPb8JPIfbXD.jpg"));
list.add(new Movie("Forrest Gump",
"Robert Zemeckis",
"Saf kalpli Forrest Gump'ın 20. yüzyıl Amerikan tarihinin en önemli anlarına tanıklık etmesi.",
"Yabancı", Color.parseColor("#0A3A1A"),
T + "/arw2vcBveWOVZr6pxd9XTd1TdQa.jpg"));
list.add(new Movie("Peaky Blinders",
"Steven Knight",
"1919 sonrası Birmingham'da Shelby ailesinin suç imparatorluğunu kurma hikayesi.",
"Yabancı", Color.parseColor("#1A1A2A"),
"https://media.themoviedb.org/t/p/w500/vUUqzWa2LnHIVqkaKVlVGkVcZIW.jpg"));
list.add(new Movie("The Sopranos",
"David Chase",
"Mafya babası Tony Soprano'nun suç dünyası ve aile sorunlarını çözmek için psikiyatriste gitmesi.",
"Yabancı", Color.parseColor("#1A1010"),
"https://media.themoviedb.org/t/p/w500/rTc7ZXdroqjkKivFPvCPX0Ru7uw.jpg"));
list.add(new Movie("Fight Club",
"David Fincher",
"Uykusuzluk çeken ofis çalışanının Tyler Durden ile tanıştıktan sonra yer altı dövüş kulüpleri kurması.",
"Yabancı", Color.parseColor("#3A0A0A"),
"https://media.themoviedb.org/t/p/w500/jSziioSwPVrOy9Yow3XhWIBDjq1.jpg"));
list.add(new Movie("The Lord of the Rings",
"Peter Jackson",
"Tek Yüzük'ü yok etmek için destansı bir yolculuğa çıkan Frodo ve Yüzük Kardeşliği.",
"Yabancı", Color.parseColor("#3A2A0A"),
T + "/6oom5QYQ2yQTMJIbnvbkBL9cHo6.jpg"));
list.add(new Movie("Friends",
"David Crane & Marta Kauffman",
"New York'ta yaşayan 6 yakın arkadaşın kariyer, aşk ve günlük hayattaki komik maceraları.",
"Yabancı", Color.parseColor("#8A5A10"),
T + "/f496cm9enuEsZkSPzCwnTESEK5s.jpg"));
list.add(new Movie("Sherlock",
"Steven Moffat & Mark Gatiss",
"Sherlock Holmes'un modern Londra'ya taşındığı karmaşık suç hikayeleri.",
"Yabancı", Color.parseColor("#1A2A3A"),
T + "/7WTsnHkbA0FaG6R9twfFde0I9hl.jpg"));
list.add(new Movie("Chernobyl",
"Johan Renck",
"1986 Çernobil nükleer felaketini ve gerçeği ortaya çıkarmak için mücadele eden kahramanları anlatan mini dizi.",
"Yabancı", Color.parseColor("#2A3A1A"),
T + "/hlLXt2tOPT6RRnjiUmoxyG1LTFi.jpg"));
list.add(new Movie("Squid Game",
"Hwang Dong-hyuk",
"Borçlu insanların hayatta kalma oyunlarına katılarak büyük ödül için mücadele etmesi.",
"Yabancı", Color.parseColor("#0A3A2A"),
T + "/1QdXdRYfktUSONkl1oD5gc6Be0s.jpg"));
list.add(new Movie("Money Heist",
"Álex Pina",
"Profesör'ün liderliğinde bir grup soyguncunun İspanya Darphane'sini basmasını anlatan gerilim dizisi.",
"Yabancı", Color.parseColor("#6A0A0A"),
"https://media.themoviedb.org/t/p/w500/reEMJA1uzscCbkpeRJeTT2bjqUp.jpg"));
list.add(new Movie("Wednesday",
"Alfred Gough & Miles Millar",
"Wednesday Addams'ın Nevermore Akademisi'nde gizemli olayları çözdüğü gençlik korku dizisi.",
"Yabancı", Color.parseColor("#1A0A2A"),
"https://media.themoviedb.org/t/p/w500/36xXlhEpQqVVPuiZhfoQuaY4OlA.jpg"));
list.add(new Movie("Oppenheimer",
"Christopher Nolan",
"Atom bombasını geliştiren J. Robert Oppenheimer'ın yaşamını ve ahlaki çıkmazını anlatan epik biyografi.",
"Yabancı", Color.parseColor("#3A2A0A"),
T + "/8Gxv8gSFCU0XGDykEGv7zR1n2ua.jpg"));
list.add(new Movie("Black Mirror",
"Charlie Brooker",
"Teknolojinin insanlık üzerindeki karanlık etkilerini anlatan bağımsız bölümlerden oluşan distopik antoloji.",
"Yabancı", Color.parseColor("#0A0A0A"),
T + "/7PRddO7z7mcPi21nZTCMGShAyy1.jpg"));
return list;
}
}
Uygulamadaki her film veya dizinin verilerini tutan veri modelidir. MovieData sınıfı bu modeli kullanarak nesneler oluşturur, MovieCardHelper ise bu nesneden okuma yaparak kart arayüzünü inşa eder.
Movie.java
package com.example.myapplication;
public class Movie {
public String title;
public String director;
public String description;
public String category;
public int posterColor;
public String posterUrl; // https:// URL veya "local:resim_adi" formatı
public Movie(String title, String director, String description,
String category, int posterColor, String posterUrl) {
this.title = title;
this.director = director;
this.description = description;
this.category = category;
this.posterColor = posterColor;
this.posterUrl = posterUrl;
}
}
MovieData.getAllMovies() listesinden kategori "Türkçe" olan filmler filtrelenerek MovieCardHelper ile dinamik kart listesi oluşturulur. Tüm arayüz XML yerine Java kodu ile programatik olarak kurulur.
TurkishMoviesActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import java.util.ArrayList;
public class TurkishMoviesActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Root
LinearLayout root = new LinearLayout(this);
root.setOrientation(LinearLayout.VERTICAL);
root.setBackgroundColor(Color.parseColor("#F4F6F8"));
root.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
// Top bar
LinearLayout topBar = new LinearLayout(this);
topBar.setBackgroundColor(Color.WHITE);
topBar.setPadding(dp(16), dp(14), dp(16), dp(14));
topBar.setElevation(dp(4));
topBar.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
TextView tvTitle = new TextView(this);
tvTitle.setText("???????? Türkçe Yapımlar");
tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tvTitle.setTextColor(Color.parseColor("#E94560"));
tvTitle.setTypeface(null, android.graphics.Typeface.BOLD);
topBar.addView(tvTitle);
root.addView(topBar);
// Scrollable list
ScrollView scroll = new ScrollView(this);
scroll.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
scroll.setFillViewport(false);
scroll.setOverScrollMode(ScrollView.OVER_SCROLL_ALWAYS);
LinearLayout list = new LinearLayout(this);
list.setOrientation(LinearLayout.VERTICAL);
list.setPadding(dp(14), dp(14), dp(14), dp(24));
list.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
for (Movie movie : MovieData.getAllMovies()) {
if ("Türkçe".equals(movie.category)) {
list.addView(MovieCardHelper.buildCard(this, movie, null));
}
}
scroll.addView(list);
root.addView(scroll);
setContentView(root);
}
private int dp(int v) {
return (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, v, getResources().getDisplayMetrics());
}
}
TurkishMoviesActivity ile aynı mimariyi kullanır. Tek fark: kategori filtresi "Yabancı" olarak değiştirilmiştir. Bu sayede iki ayrı ekran tek bir MovieData kaynağından beslenir.
ForeignMoviesActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
public class ForeignMoviesActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout root = new LinearLayout(this);
root.setOrientation(LinearLayout.VERTICAL);
root.setBackgroundColor(Color.parseColor("#F4F6F8"));
root.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
LinearLayout topBar = new LinearLayout(this);
topBar.setBackgroundColor(Color.WHITE);
topBar.setPadding(dp(16), dp(14), dp(16), dp(14));
topBar.setElevation(dp(4));
topBar.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
TextView tvTitle = new TextView(this);
tvTitle.setText("???? Yabancı Yapımlar");
tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tvTitle.setTextColor(Color.parseColor("#0F3460"));
tvTitle.setTypeface(null, android.graphics.Typeface.BOLD);
topBar.addView(tvTitle);
root.addView(topBar);
ScrollView scroll = new ScrollView(this);
scroll.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
scroll.setFillViewport(false);
scroll.setOverScrollMode(ScrollView.OVER_SCROLL_ALWAYS);
LinearLayout list = new LinearLayout(this);
list.setOrientation(LinearLayout.VERTICAL);
list.setPadding(dp(14), dp(14), dp(14), dp(24));
list.setLayoutParams(new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
for (Movie movie : MovieData.getAllMovies()) {
if ("Yabancı".equals(movie.category)) {
list.addView(MovieCardHelper.buildCard(this, movie, null));
}
}
scroll.addView(list);
root.addView(scroll);
setContentView(root);
}
private int dp(int v) {
return (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, v, getResources().getDisplayMetrics());
}
}
Android Studio ile geliştirilen bu uygulama; kullanıcı yönetimi, internet'ten görsel yükleme, favori sistemi ve gerçek zamanlı arama gibi gerçek dünya uygulamalarında kullanılan temel Android geliştirme kavramlarını bir arada öğrenmek için kapsamlı bir başlangıç projesidir.
Emine Zeynep Sağır
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.