Mengenal Android (6) : Fragment – Berkomunikasi dengan Fragment-fragment lain

Oleh : Reza Ervani

بسم الله الرحمن الرحيم

Referensi :

Dalam rangka penggunaan ulang komponen-komponen fragment UI, kita mesti membangun masing-masing sebagai sebuah self-contained mandiri, yakni komponen modular yang menentukan layoutnya dan prilakunya sendiri. Sekali kita telah menentukan fragment-fragment yang dapat digunakan ulang ini, kita dapat mengasosiasikan mereka dengan suatu Activity dan mengkoneksikannya dengan logika aplikasi untuk mewujudkan keseluruhan komposisi UI.

Seringkali kita akan membutuhkan satu fragment untuk berkomunikasi dengan yang lain, misalnya untuk merubah konten yang didasarkan pada event yang dilakukan oleh pengguna. Semua komunikasi fragment-ke-fragment dilakukan lewat Activity yang diasosiakan. Dua fragment seharusnya tidak akan pernah berkomunikasi secara langsung.

Menentukan suatu Interface

Untuk memperkenankan suatu Fragment berkomunikasi ke Activity-nya, kita dapat menentukan suatu interface di class Fragment dan mengimplementasikannya didalam Activity. Fragment meng-capture implementasi interfae sepanjang metode lifecycle onAttach() dan dapat kemudian memanggil metode Interface guna berkomunikasi dengan Activity.

Berikut contoh komunikasi Fragment ke Activity :


public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Activity Kontainer mesti mengimplementasikan interface ini
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // Ini memastikan bahwa activity kontainer telah mengimplementasikan
        // interface callback. Jika tidak maka akan dimunculkan eksepsi
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}

Kini fragment dapat mengantarkan pesan ke activity dengan memanggil metode onArticleSelected()  (atau metode lain di dalam interface) menggunakan instance mCallback pada interface OnHeadlineSelectedListener

Sebagai contoh, metode berikut di dalam fragment dipanggil saat pengguna mengklik sebuah daftar item. Fragment menggunakan interface callback untuk mengantarkan event ke activity induk :


  @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Mengirimkan event ke activity host
        mCallback.onArticleSelected(position);
    }

Mengimplementasikan Interface

Dalam rangka menerima callback event dari fragment, activity yang menjadi hostnya mestilah mengimplementasikan interface yang didefinisikan di class fragment

Sebagai contoh berikut activity yang mengimplementasikan interface dari contoh diatas


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

    public void onArticleSelected(int position) {
        // Pengguna memilih headline dari suatu artikel dari HeadlinesFragment
        // Kode untuk menampikan artikel ditempatkan disini
    }
}

Mengirimkan suatu Pesan ke Suatu Fragment

Activity host dapat mengirimkan pesan ke suatu fragment dengan meng-capture instance Fragment dengan findFragmentById(), kemudian secara langsung memanggil metode public milik fragment tersebut.

Sebagai contoh, bayangkan bahwa activity yang ditunjukkan diatas bisa saja berisi fragment lain yang digunakan untuk menampilkan item yang ditentukan oleh data yang dikeluarkan di dalam metode callback diatas. Dalam kasus ini, activity dapat melewatkan informasi yang diterima di dalam metode callback ke fragment lain yang akan menampilkan item tersebut :


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

    public void onArticleSelected(int position) {</pre>
        // Pengguna memilih headline dari suatu artikel dari HeadlinesFragment
        // Kode untuk menampikan artikel ditempatkan disini</pre>

 ArticleFragment articleFrag = (ArticleFragment)
 getSupportFragmentManager().findFragmentById(R.id.article_fragment);

 if (articleFrag != null) {
 // Jika artikel frag tersedia, kita berada di layout dua panel
 // Memanggil metode di ArticleFragment untuk mengupdate kontennya
 articleFrag.updateArticleView(position);
 } else {
 // Otherwise, we're in the one-pane layout and must swap frags...

 // Membuat fragment dan memberikannyanya suatu argumen untuk artikel yang dipilih
 ArticleFragment newFragment = new ArticleFragment();
 Bundle args = new Bundle();
 args.putInt(ArticleFragment.ARG_POSITION, position);
 newFragment.setArguments(args);

 FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

 // Menggantikan apapun yang ada di dalam view fragment_container dengan fragment ini,
 // dan menambahkan transaksi ke back stack sehingga pengguna dapat kembali
 transaction.replace(R.id.fragment_container, newFragment);
 transaction.addToBackStack(null);

 // Melakukan commit untuk transaksi tersebut
 transaction.commit();
 }
 }
}

About Reza Ervani 387 Articles
Adalah pendiri programming.rezaervani.com -

Be the first to comment

Leave a Reply

Your email address will not be published.


*


This site uses Akismet to reduce spam. Learn how your comment data is processed.