Berkomunikasi dengan fragmen Lain

Untuk menggunakan kembali komponen UI Fragmen, Anda harus membangun masing-masing komponen sebagai komponen completely self-contained dan modular yang menentukan layout dan perilakunya sendiri. Setelah Anda menentukan Fragmen yang dapat digunakan kembali ini, Anda dapat mengaitkannya dengan Activity dan menghubungkannya dengan logika aplikasi untuk mewujudkan keseluruhan UI komposit.

Seringkali Anda ingin satu Fragmen untuk berkomunikasi dengan Fragmen yang lain, misalnya untuk mengubah konten berdasarkan peristiwa pengguna. Semua komunikasi Fragmen-to-Fragmen dilakukan baik melalui ViewModel bersama atau melalui Activity terkait. Dua Fragmen tidak boleh berkomunikasi secara langsung.

Cara yang disarankan untuk berkomunikasi antar fragmen adalah dengan membuat objek ViewModel yang dibagikan. Kedua fragmen dapat mengakses ViewModel melalui Activity yang berisi. Fragmen dapat memperbarui data dalam ViewModel dan jika data diekspos menggunakan LiveData status baru akan didorong ke fragmen lain selama mengamati LiveData dari ViewModel. Untuk melihat cara mengimplementasikan komunikasi semacam ini, baca bagian 'Bagikan data antar Fragmen' di Panduan ViewModel.

Jika Anda tidak dapat menggunakan ViewModel bersama untuk berkomunikasi antar Fragmen Anda, Anda dapat secara manual mengimplementasikan aliran komunikasi menggunakan antarmuka. Namun demikian, akhirnya menjadi lebih banyak pekerjaan untuk diimplementasikan dan tidak mudah digunakan kembali di Fragmen lain.

Tentukan Antarmuka

Untuk memungkinkan Fragmen berkomunikasi hingga Activity-nya, Anda dapat menentukan antarmuka di kelas Fragmen dan mengimplementasikannya dalam Activity. Fragmen menangkap implementasi antarmuka selama metode siklus onAttach(), lalu dapat memanggil metode Antarmuka untuk berkomunikasi dengan Activity.

Berikut adalah contoh komunikasi Fragmen ke Activity:

HeadlinesFragment

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener callback;

    public void setOnHeadlineSelectedListener(OnHeadlineSelectedListener callback) {
        this.callback = callback;
    }

    // This interface can be implemented by the Activity, parent Fragment,
    // or a separate test implementation.
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    // ...
}

MainActivity

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

    @Override
    public void onAttachFragment(Fragment fragment) {
        if (fragment instanceof HeadlinesFragment) {
            HeadlinesFragment headlinesFragment = (HeadlinesFragment) fragment;
            headlinesFragment.setOnHeadlineSelectedListener(this);
        }
    }
}

Sekarang fragmen dapat mengirimkan pesan ke aktivitas dengan memanggil metode onArticleSelected() (atau metode lain di antarmuka) menggunakan instance mCallback dari antarmuka OnHeadlineSelectedListener.

Misalnya, metode dalam fragmen berikut dipanggil ketika pengguna mengklik item daftar. Fragmen tersebut menggunakan antarmuka callback untuk mengirimkan acara ke aktivitas induk.

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

Mengimplementasikan Antarmuka

Untuk menerima callback peristiwa dari fragmen, aktivitas yang menghostingnya harus mengimplementasikan antarmuka yang ditentukan dalam kelas fragmen.

Misalnya, aktivitas berikut mengimplementasikan antarmuka dari contoh di atas.

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
    }
}

Mengirimkan Pesan ke Fragmen

Activity host dapat mengirimkan pesan ke sebuah fragmen dengan menangkap instance Fragment dengan findFragmentById(), lalu secara langsung memanggil metode publik fragmen tersebut.

Misalnya, bayangkan bahwa aktivitas yang ditunjukkan di atas dapat berisi fragmen lain yang digunakan untuk menampilkan item yang ditentukan oleh data yang dikembalikan dalam metode callback di atas. Dalam kasus ini, aktivitas dapat meneruskan informasi yang diterima dalam metode callback ke fragmen lain yang akan menampilkan item tersebut:

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

Untuk mempelajari lebih lanjut tentang implementasi Fragmen, lihat Fragmen. Anda juga dapat mempelajari lebih lanjut dengan menggali lebih dalam aplikasi contoh yang relevan.