Android 201Başlangıç seviyesi derslerde Android uygulama geliştirme ortamını detaylı olarak inceliyoruz.

Tüm Eğitimleri Aldın mı? Kendini sınamanın tam zamanı

Haydi Sınava Gir

Diğer Fragment'lar ile İletişime Geçmek

Kategori : Mobil | Lisans : Creative Commons Attribution 2.5 Generic (CC BY 2.5) | En son 12.09.2019 tarihinde güncellendi
Eğitmen : Geleceği Yazanlar Ekibi
Etiketler : android-farkli-fragmentler android

Fragment arayüz bileşenlerini tekrar tekrar kullanabilmek istiyorsanız her birini, kendi kendini taşıyabilen, kendi layout'unu ve davranışını tanımlayabilen modüler bir yapıda inşa etmelisiniz. Tekrar kullanılabilir Fragment'ları bir kere tanımladıktan sonra, onları bir Activity ile ilişkilendirmeli ve genel arayüz mantığında yerine koymak için uygulama mantığına oturtmalısınız.

Genellikle bir Fragment'ı diğeriyle iletişime sokmak isteyeceksiniz. Örneğin bir kullanıcı olayına göre diğerinin içeriğini değiştirmek isteyeceksiniz. Fragment'tan Fragment'a yapılacak tüm iletişim, ilişkili oldukları Activity üzerinden gerçekleşir. Activity, burada trafik polisi gibidir. İki Fragment onsuz asla doğrudan iletişime geçmez.

Bu eğitim içeriğinde şunları göreceğiz:

 

Fragment'tan mesaj göndermek

Arayüz sınıfının tanımlaması

Bir Fragment'ın bağlı olduğu Activity ile iletişime geçmesi için Fragment sınıfınızın içinde bir arayüz sınıfı tanımlayabilir ve onu da Activity içinde gerçekleyebilirsiniz. Fragment, onAttach8) yaşam döngüsü olayı boyunca bu arayüz (interface) sınıfının gerçeklemesini (implementation) yakalar ve bu arayüz sınıfının metotlarını Activity ile haberleşmek için çağırır.

Aşağıda Fragment'tan Activity'ye doğru bir iletişim örneği var:

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Taşıyıcı durumdaki Activity bu interface'i mutlaka implemente etmeli
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        
        // bununla taşıyıcı activity'nin bu callback interface'ini
        // gerçeklediğinden emin oluruz. Etmemişse hata fırlatırız
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " mutlaka OnHeadlineSelectedListener");
        }
    }
    
    ...
}

Bu kodla birlikte artık Fragment, mCallback'in onArticleSelected() metodu yardımıyla Activity'ye mesaj teslim edebilir. mCallBack, OnHeadlineSelectedListener interface'inin bir örneği (instance) oluyor.

Örneğin aşağıdaki metod, kullanıcı bir liste öğesine tıklayınca çağırılıyor. Burada Fragment, callback interface'ini (mCallback) kullanarak olayı üstteki Activity'ye iletiyor.

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // olayı üstteki activity'ye iletelim
        mCallback.onArticleSelected(position);
    }

 

Arayüz sınıfının gerçeklemesi

Fragment'tan olaylarla ilişkili callback'leri alabilmek için ev sahibi Activity'nin Fragment sınıfı içinde tanımlanmış arayüz (interface) sınıfını gerçeklemesi gerekiyor.

Aşağıdaki örnekte gördüğünüz Activity, yukarıdaki örnekte yer alan interface'i gerçekliyor.

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...
    
    public void onArticleSelected(int position) {
        // kullanıcı HeadLinesFragment'tan bir yazının başlığını seçer
        // burada da yazıyı gösterecek işlemleri başlatırız
    }
}

 

Fragment'a mesaj göndermek

Ev sahibi Activity, bir örneğine (instance) findFragmentById() metoduyla eriştiği Fragment'a isterse mesaj da gönderebilir. Ardından o Fragment'ın public metotlarını doğrudan çalıştırabilir.

Örneğin, yukarıdaki örneklerde de geçtiği gibi bir Activity hayal edin. İçinde yazı başlıklarının listelendiği Fragment'tan (HeadLinesFragment) başka bir Fragment daha olsun ve seçilen başlığa göre bu Fragment'ta ilgili içerik gösterilsin. Bu Activity yukarıdaki callback metodunun döndürdüğü veriden yararlanarak ilgili içeriği diğer Fragment'ta gösterebilir. Aşağıdaki örnekte de bunu gerçekleştiriyoruz.

Activity, callback metoduyla gelen bilgiden yararlanarak bu bilgileri diğer Fragment'ta göstertiyor:

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // kullanıcı HeadlinesFragment'tan bir yazının başlığını seçti
        // şimdi seçtiği başlığa göre bir gösterme işlemi yapalım

        // önce detaylı bilgiyi göstereceğimiz ArticleFragment'a erişelim
        ArticleFragment articleFrag = (ArticleFragment)
                getSupportFragmentManager().findFragmentById(R.id.article_fragment);

        if (articleFrag != null) {
            // eğer articleFrag kullanılabilirse iki layout'u da 
            // ekranda görebiliyoruz demektir

            // ArticleFragment'ın içideyken içeriğini güncelleyecek
            // metodu çağıralım
            articleFrag.updateArticleView(position);
        } else {
            // eğer articleFrag kullanılabilir değilse
            // tek parçalı bir layout'tayız demektir ve fragment'ları yer
            // değiştirmemiz gerekir

            // bir Fragment oluşturalım ve seçilen başlığa göre ona belli
            // argümanlar verelim
            ArticleFragment newFragment = new ArticleFragment();
            Bundle args = new Bundle();
            args.putInt(ArticleFragment.ARG_POSITION, position);
            newFragment.setArguments(args);
        
            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // fragment_container view'ını bu yeni fragment ile değiştirelim
            // ve back stack'e bir işlem ekleyelim ki kullanıcı
            // geri döndüğünde daha önce gördüğü Fragment'ı görebilsin
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // işlerimizi bitirelim
            transaction.commit();
        }
    }
}

 

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: Communicating with Other Fragments