Uygulama ekranının yapısı: Java ile Activity ve View

Kerem Aydın·6 Temmuz 2026·⏱2 dk

Activity bir ekrandır (UI denetleyicisi) ve View hiyerarşisi için bir kapsayıcıdır; View/ViewGroup ise Activity'nin görüntülediği ve kullanıcının etkileşime girdiği görünür öğeler ve düzenlerdir.

Activity nedir ve yaşam döngüsü

Activity, uygulamanın tek bir ekranını temsil eder ve arayüz durumlarını yönetir: oluşturma, görünürlük, duraklatma ve yok etme. Yaşam döngüsünün temel yöntemleri şunlardır:

  • onCreate(Bundle) — başlatma, setContentView() ile layout ayarlama.
  • onStart(), onResume() — Activity görünür ve etkileşime hazırdır.
  • onPause(), onStop() — durumu kaydetmek ve kaynakları serbest bırakmak gerekir.
  • onDestroy() — son temizlik.

Java ile temel bir Activity örneği:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); // XML düzenini bağlıyoruz

        Button button = findViewById(R.id.myButton);
        button.setOnClickListener(v -> 
            Toast.makeText(this, "Düğmeye tıklandı!", Toast.LENGTH_SHORT).show()
        );
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // gerekirse dinleyicileri temizleme
    }
}

Öneriler:

  • Konfigürasyon değişikliğinde durumu koruyun (onSaveInstanceState).
  • Ağır işlemleri arka plana taşıyın (Executor, WorkManager).

View, ViewGroup ve düzenler (XML ve programatik olarak)

View temel öğedir: TextView, Button, ImageView. ViewGroup diğer View'lar için bir kapsayıcıdır. Popüler düzenler:

  • ConstraintLayout — esnek, iç içe geçmeyi azaltır.
  • LinearLayout — eksene göre sıralar, basit formlar için uygundur.
  • FrameLayout — katmanları üst üste bindirir (fragment'lar için kapsayıcı). Manuel findViewById yerine elemanlara tür güvenli erişim için ViewBinding kullanın.

ConstraintLayout ile XML örneği:

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@id/title"/>
</androidx.constraintlayout.widget.ConstraintLayout>

Olaylar, RecyclerView ve fragment'lar

OnClickListener, OnTouchListener veya GestureDetector aracılığıyla tıklama ve jest işleme. Uzun listeler için Adapter ve ViewHolder ile RecyclerView kullanın:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private final List<String> items;
    public static class MyViewHolder extends RecyclerView.ViewHolder {
        TextView textView;
        MyViewHolder(View v) { super(v); textView = v.findViewById(R.id.text); }
    }
    @Override public void onBindViewHolder(MyViewHolder holder, int pos) {
        holder.textView.setText(items.get(pos));
        holder.itemView.setOnClickListener(v -> handleClick(pos));
    }
    // diğer zorunlu yöntemler...
}

Fragment'lar Activity içinde modülerlik sağlar, FragmentManager tarafından yönetilir ve UI'nın yeniden kullanılmasına olanak tanır (telefon/tablet).

Tür güvenliği için ViewBinding kullanın ve çok sayıda findViewById çağrısından kaçının.

Ağır işlemleri UI iş parçacığında çalıştırmayın — uygulama "donar".

Sık yapılan hatalar

  • Konfigürasyon değişikliğinden sonra null kontrolü yapılmadan onCreate'te bağlamalar — Activity yeniden oluşturulduğunda öğeler mevcut olmayabilir.
  • Bellek sızıntıları: Context veya View referanslarının statik alanlarda tutulması, kaldırılmayan dinleyiciler.
  • Karmaşık iç içe geçmiş düzenler — performansı düşürür; ConstraintLayout ile değiştirin.
  • Görsel yükleme veya ağ isteklerinde ana iş parçacığının engellenmesi — Glide, Coil, Coroutines/Executor kullanın.

SSS

  • Her zaman Fragment kullanmak gerekir mi? Hayır — fragment'lar UI'nın yeniden kullanımı ve uyarlanabilirlik için faydalıdır, ancak basit ekranlar doğrudan Activity'de uygulanabilir.
  • Jetpack Compose'a ne zaman geçilmeli? Compose deklaratif UI'yı basitleştirir; yeni ekranlar ve ekip desteği durumunda geçiş mantıklıdır, ancak mevcut View/ViewGroup kodu çalışmaya devam eder.
  • Dinleyicilerle bellek sızıntılarını nasıl önlersiniz? Dinleyicileri onDestroy/onStop'ta kaldırın ve Activity'yi statik alanlarda saklamayın.

Basit bir projeyle başlayın: bir Activity oluşturun, ConstraintLayout'a birkaç View ekleyin, RecyclerView bağlayın — ve eski yaklaşımları kademeli olarak ViewBinding ve mimari kalıplarla (MVVM) değiştirin.