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í.