Uygulama ekranının yapısı: Java ile Activity ve View
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.