Android: forma correcta de saltar entre fragmentos
Esta es una pregunta de diseño, en lugar de una técnica.
Caso general : Quiero que un evento de IU en un fragmento haga cambios en toda la actividad.
- ¿La implementación vacía de métodos abstractos es un buen enfoque?
- Android: Cómo implementar "control distribuido"
- ¿Qué patrones de diseño se utilizan en Android?
- Qué patrones de diseño debo aprender antes de iniciar Android Development
- ¿Alternativa al patrón observable?
Caso específico : Tengo dos fragmentos, alojados en la misma actividad. Cuando el usuario hace clic en un botón de uno de esos fragmentos, quiero que sea reemplazado por el otro.
No quiero , sin embargo, mis Fragmentos tocar mi actividad. Tal vez quiera cambiar el comportamiento más tarde (tal vez, en una pantalla más grande, muestre ambos fragmentos en lugar de reemplazar el primero), y no quiero que mi código de fragmento tenga esa lógica.
Lo que hice fue implementar una clase Listener
en mis fragmentos, que reporta los eventos de vuelta a la Activity
. De esta manera, si quiero usar otra clase de Activity
con un comportamiento de visualización diferente, sólo puedo cambiar el oyente y dejar el código Fragment
sin tocar.
¿Es esta una buena manera de hacerlo? ¿Existe una buena práctica estándar o un mejor patrón de diseño?
- onCreateView () no se llama inmediatamente después de FragmentTransaction.commit ()
- Patrón de Android para las preferencias / ajustes
- ¿Cuál es la estructura / patrón de android / java para organizar las llamadas de servicio web http en el proyecto?
- Android: sobreescribir onPause y onResume - forma correcta
- Aplicación de diseño con más código de confusión?
- Compartir datos entre actividades y servicios
- ¿Es seguro para mí tratar una Actividad como singleton
- ¿Es preferible usar Activity.onAttachFragment o Fragment.onAttach para comunicarse entre una Actividad y un fragmento anidado?
Usar los oyentes es la forma recomendada de comunicarse entre Fragmento y su actividad.
Vea esta sección de documentación de Android para infromation. Larga historia corta que sólo implementar una interfaz de escucha por la clase de actividad y elenco getActivity () resultan en un fragmento de un oyente.
Desde mi experiencia personal esto es muy conveniente porque te permite:
- Easilly cambiar la actividad subyacente (por ejemplo, alojar fragmento entero en una actividad envoltura de compatibilidad en pre-3.0 y alojar este fragmento, junto con otros en 11 +)
- Fácilmente controla si la actividad del contenedor soporta callbacks o no. Sólo comprobar si es implementar el oyente y hacer sus acciones específicas de la aplicación si no lo hace.
Usted tiene razón sobre el uso de un Listener. Esto es algo que también tuve que tratar en un proyecto en el trabajo. La mejor manera de manejarlo es hacer que el Fragmento sea independiente en la naturaleza. Cualquier cosa que desee interactuar con el Fragmento debe usar su API pública y / o establecer oyentes para eventos específicos. Si está familiarizado con los patrones de diseño , este es el patrón de Observador . Los eventos pueden ser generales o específicos, así como contener datos o no datos.
Como ejemplo de mi proyecto, tuve dos Fragmentos. Un ListFragment y un InfoFragment que mostraron el ListItem seleccionado. El ListFragment ya tiene una interfaz de escucha para mi actividad para conectarse a, pero el InfoFragment no desde su su Fragmento básico. He añadido una interfaz de escucha al InfoFragment que sería notificado cuando el fragmento quería cerrar. Para el Fragmento, esto podría ser por una pulsación de botón, o una acción específica ocurrió, pero en lo que a mi Actividad se refiere, cuando se desencadena el Evento, cerraría la vista Fragmento.
No tengas miedo de usar muchos Oyentes para Fragmentos, sino también intentar agruparlos mediante una acción específica usando parámetros de datos para individualizarlos. ¡Espero que esto ayude!
Una respuesta técnica para:
Tengo dos fragmentos, alojados en la misma actividad. Cuando el usuario hace clic en un botón de uno de esos fragmentos, quiero que sea reemplazado por el otro.
FragmentTransaction ft = this.getFragmentManager().beginTransaction(); Fragment mFragment = Fragment.instantiate(this.Activity(), Fragment2.class.getName()); ft.replace(android.R.id.content, mFragment); ft.commit();
public class Example_3_Mainfile extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.example_3_mainfile); Fragment fr ;//make class that extend to thefragment fr = new Act_2_1(); FragmentManager fm = getFragmentManager(); FragmentTransaction fragmentTransaction = fm.beginTransaction(); fragmentTransaction.replace(R.id.fragment_place, fr); //id get of fragment tag from xml file there decelar fragmentTransaction.commit(); } }
- ¿Cómo puedo importar una biblioteca nativa (archivo .so) en Eclipse?
- Android: ¿Cuál es el nombre de la carpeta de los archivos jar (LIB o LIBS)?