X

Comunicarse con otros Fragments

Para reutilizar los componentes de la Interfaz de Usuario del Fragment, deberías crear cada uno como un contenedor de ellos mismos, componentes modulares que definen su propio layout y comportamiento. Una vez que has definido dichos fragmentos reutilizables, puedes asociarlos con una actividad y conectarlos con la lógica de la aplicación

A menudo querrás que uno fragmento se comunique con otro, por ejemplo para cambiar el contenido, basándose en un petición del usuario. Todas las comunicaciones Fragmento a Fragmento se hacen a través de la actividad asociada. Dos fragmentos no deberían comunicarse nunca directamente.

Definir un Interfaz

Para permitir a un fragmento que se comunique con su actividad, puedes definir un interfaz de la clase Fragment e implementarlo dentro de la actividad. El fragmento captura la implementación de la interfaz durante el método del ciclo de vida onAttach(), y puedes llamar después a los métodos del interfaz para comunicarte con la actividad.

Observa el siguiente ejemplo de una comunicación Fragmento a Actividad:

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

    ...
}

Ahora el fragmento puede enviar mensajes a la actividad gracias a las llamadas al método onArticleSelected() (u otros métodos del interfaz) utilizando la instancia mCallback del interfaz OnHeadlineSelectedListener.

Por ejemplo, el siguiente método del fragmento se llama cuando el usuario presiona en un elemento de la lista. El fragmento usa la llamada al interfaz para enviar el evento de la actividad padre.

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

Implementar el Interfaz

Para recibir las llamadas desde el fragmento, la actividad que lo contiene debe implementar el interfaz definido en la clase del fragmento.

Por ejemplo, la siguiente actividad implementa el interfaz del ejemplo de arriba.

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

Enviar un Mensaje al Fragment

La actividad que contiene el fragmento puede enviar mensajes al mismo capturando la instancia Fragment con findFragmentById(), después llama directamente a los métodos públicos del fragmento.

Por ejemplo, imagina que la actividad mostrada anteriormente pudiese contener otro fragmento que se utilizaría par mostrar el elemento especificado mediante datos obtenidos del método que hemos llamado arriba. En este caso, la actividad puede pasar la información recibida en el método al otro fragmento que se encargará de mostrar el elemento:

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

 

Puedes ver más información sobre Comunicarse con otros Fragments en la página oficial de Google en inglés pulsando aquí.

Los comentarios de Disqus están cargando....