Berkomunikasi dengan Fragment yang lain

Untuk memanfaatkan komponen-komponen UI Fragment, kita sebaiknya membuat masing-masing komponen sebagai komponen modular secara utuh yang mendefinisikan layout dan perilakunya sendiri. Setelah kita mendefiniskan 'Fragment-fragment', kita bisa mengaitkan/mengasosiasikannya dengan suatu 'Activity' dan menghubungkannya dengan lojik aplikasi untuk merealisasikan keseluruhan UI gabungan tersebut.

Seringkali kita ingin satu 'fragment' untuk berkomunikasi dengan 'fragment' yang lain, contohnya untuk mengubah konten berdasarkan suatu 'event' user. Semua komunikasi 'fragment-ke-fragment' dilakukan melalui 'Activity' yang terasosiasi/terkait. Dua 'fragment' seharusnya tidak pernah berkomunikasi secara langsung.

Membuat 'Interface'

Untuk membuat suatu 'Fragment' berkomunikasi hingga 'Activity' nya, kita bisa membuat interface di dalam class 'Fragment' dan mengimplementasikannya di dalam 'Activity'. 'Fragment' akan menangkap implementasi interface pada method (siklus hidup) 'onAttach()' dan kemudian bisa memanggil method-method 'Interface' untuk berkomunikasi dengan 'Activity' tersebut.

Berikut dibawah ini adalah contoh komunikasi 'Fragment' ke 'Activity':

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // Container Activity must implement this interface
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

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

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}
Sekarang 'fragment' tersebut bisa mengirim pesan ke 'activity' dengan memanggil method 'onArticleSelected()' (atau method-method lainnya di dalam 'interface') dengan menggunakan instan 'mCallback' dari interface 'onHeadlineSelectedListener'.

Contohnya, method berikut ini di dalam 'fragment' dipanggil ketika user men-klik pada daftar item. 'Fragment' tersebut akan menggunakan 'interface' untuk mengirim 'event' ke 'activity' induknya.

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

Mengimplementasikan 'Interface'

Untuk menerima 'event' dari 'fragment', 'activity' yang menjadi tempat penampungnya harus mengimplementasikan 'interface' yang didefinisikan di dalam class 'fragment'.

Contohnya, 'activity' berikut ini akan mengimplementasikan 'interface' dari contoh di atas tadi.
public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}

Mengirim Pesan ke 'Fragment'

'Activity' yang menjadi tempat penampung bisa mengirim pesan ke suatu 'fragment' dengan menangkap instan 'Fragment' dengan cara 'findFragmentById()', kemudian memanggil langsung method-method public dari 'fragment' tersebut.

Contohnya, bayangkan bahwa 'activity' yang ditunjukkan di atas mungkin berisi 'fragment' lain yang digunakan untuk menampilkan item yang ditentukan oleh data yang dihasilkan (dikembalikan) di dalam method di atas. Dalam kasus ini, 'activity' bisa melewatkan informasi yang diterima di dalam method tersebut ke 'fragment' lainnya yang akan menampilkan item:
public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article

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

        if (articleFrag != null) {
            // If article frag is available, we're in two-pane layout...

            // Call a method in the ArticleFragment to update its content
            articleFrag.updateArticleView(position);
        } else {
            // Otherwise, we're in the one-pane layout and must swap frags...

            // Create fragment and give it an argument for the selected article
            ArticleFragment newFragment = new ArticleFragment();
            Bundle args = new Bundle();
            args.putInt(ArticleFragment.ARG_POSITION, position);
            newFragment.setArguments(args);

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // Replace whatever is in the fragment_container view with this fragment,
            // and add the transaction to the back stack so the user can navigate back
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // Commit the transaction
            transaction.commit();
        }
    }
}
referensi : https://developer.android.com/training/basics/fragments/communicating.html
lisensi: cc by

No comments: