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(); } } }
Leave a Reply