Fragment'ı şöyle düşünebilirsiniz: Activity'nin modüler bir bölümüdür. Kendi yaşam döngüsü vardır, kendi giriş olaylarını (input events) kendisi alır ve Activity çalışmaya devam ederken eklenip çıkarılabilir. Tıpkı farklı Activity'lerde tekrar tekrar kullanabileceğiniz bir “alt-Activity” gibi de düşünebilirsiniz.
Bu eğitim içeriğinde Fragment sınıfının nasıl genişletileceğini öğrenebilirsiniz. Bunu yaparken Android Destekleme Kütüphanesi kullanacağız ve böylece uygulamanız Android 1.6'ya kadar alt sürüm sistemlerle bile uyumlu kalacaktır.
NOT: Eğer en düşük API seviyesini uygulamanız için 11 ve yukarısı yapmayı düşünüyorsanız, Android Destekleme Kütüphanesi'ni kullanmanıza gerek kalmayacaktır. Bunun yerine o platform sürümünün kendi Fragment sınıfını ve ilişkili API'lerini kullanabilirsiniz. Sadece bu eğitim içeriğinin Destekleme Kütüphanesi'nden gelen API'leri kullanmayı esas aldığını ve bundan dolayı platformun içindeki sınıflardan farklı bazı sınıf ya da API isimleriyle karşılaşabileceğinizi unutmayın.
Bu içerikte anlatılanları yapmaya başlamadan önce projenizi Destekleme Kütüphanesi'ni kullanacak şekilde yapılandırmanız gerekiyor. Eğer daha önce Android Destekleme Kütüphanesi kullanmadıysanız v4 kütüphanesini Destekleme Kütüphanesi'nin Kurulumu belgesine bakarak projenize eklemelisiniz. Aynı yolu kullanarak Activity'lerinizde Action Bar'ı (eylem çubuğu) kullanmak için v7 appcompat kütüphanesini de ekleyebilirsiniz. Böylelikle hem Android 2.1 ve üstüyle uyumlu bir uygulamanız olur hem de Fragment API'lerini o sürümlerde bile kullanabilirsiniz.
Fragment sınıfı oluşturmak
Bir Fragment sınıfı oluşturmak için Fragment sınıfını türetin (extend) ve temel yaşam döngüsü metotlarını -tıpkı Activity sınıfı için yaptığınız gibi- uygulama gereksinimlerinize göre yeniden yazın (override).
Bir Fragment oluştururmanın önemli bir farkı, layout tanımını yapmak için onCreateView() isimli callback metodunu kullanmanız gerekmesidir. Aslında bu metot, bir Fragment'ı ayakta tutmak için gereken tek callback metodudur. Aşağıdaki kod bloğunda, kendi layout'unu tanımlayan basit bir Fragment örneği görüyorsunuz:
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.ViewGroup;
public class ArticleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// bu fragment'in layout'unu hazır hale getirelim
return inflater.inflate(R.layout.article_view, container, false);
}
}
Tıpkı bir Activity'de olduğu gibi bir Fragment da diğer yaşam döngüsü callback'lerini (Activity'ye eklenirken ya da Activity'den çıkarılırken ve Activity'nin yaşam döngüsü durumları arasında geçişler olurken gerçekleşen) gerçeklemelidir. Örneğin Activity'nin onPause() metodu çağrıldığında o Activity'deki her Fragment onPause() için bir çağrı alır.
XML kullanarak bir Fragment'i bir Activity'ye eklemek
Fragment'ların tekrar kullanılabilir yapılar olduğuna ve modüler bir UI bileşeni olduğuna daha önce değişmiştik. Bununla beraber Fragment sınıfının her örneğinin (instance) ebeveyn bir FragmentActivity ile ilişkilendirilmesi gerektiğini de belirtmemiz gerek. Bu ilişkiyi sağlamak için her Fragment'ı Activity layout'unu barındıran XML dosyası içinde tanımlayabilirsiniz.
NOT: Fragment'lar tek başına kullanılamazlar. Mutlaka onu yönetebilecek, onun durumundan anlayabilecek bir Activity'ye ihtiyaç var ki bu tür Activity'ler de API 11'den sonra SDK'ya entegre edildi ve ek olarak Android Destekleme Kütüphanesi'nin de içine konuldu.
NOT: FragmentActivity sınıfı Android Destekleme Kütüphanesi içinde sunulan özel bir Activity'dir. API 11 ve altındaki Android sürümlerde Fragment'ın yönetilebilirliğini sağlar. Eğer projenizin en düşük API (minSdkVersion) değeri 11 ve yukarısıysa, bu iş için normal Activity sınıfını kullanabilirsiniz.
Aşağıdaki kod bloğunda geniş ekranlar için düşünülmüş bir Activity layout'u var. Bu layout içinde de iki tane fragment bulunuyor. Geniş ekranlarda kullanılsın diye “large” eleyicisinin dizin adında olduğuna dikkatinizi çekeriz.
res/layout-large/news_articles.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<fragment android:name="com.example.android.fragments.HeadlinesFragment"
android:id="@+id/headlines_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="com.example.android.fragments.ArticleFragment"
android:id="@+id/article_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
TÜYO: Farklı ekran boyutları için layout oluşturma konusunda daha fazla bilgi almak isterseniz Farklı Ekran Boyutlarını Desteklemek belgesine bakabilirsiniz.
Şimdi yukarıda tanımladığımız layout'u Activity'mize uygulayalım:
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);
}
}
Eğer v7 appcompat kütüphanesini kullanıyorsanız, Activiy'niz FragmentActivity'nin bir alt sınıfı olan ActionBarActivity'den türemelidir. (Daha fazla bilgi için Action Bar Eklemek içeriğine bakabilirsiniz)
NOT: Bir Fragment'ı Activity layout'una XML dosyası üzerinden eklediğinizde bu Fragment'ı çalışma zamanında kaldıramazsınız. Eğer Fragment'ları kullanıcı etkileşimi sırasında çıkarıp eklemeyi planlıyorsanız, bundan sonraki içerikte gösterildiği gibi Activity içinde ve Activity başladığında eklemelisiniz.
Bu sayfadaki parçalar Android Open Source Project kapsamında oluşturulmuş ve paylaşılmış içeriğin küçük değişiklikler yapılmış hâlidir ve Creative Commons 2.5 Attribution License'ta belirlenen koşullara göre kullanılmıştır.
Bu eğitim içeriğinin orijinal hâline buradan ulaşabilirsiniz: Creating a Fragment