2011-09-06 12 views
19

Esta es una pregunta de diseño, en lugar de técnica.Android: forma correcta de saltar entre fragmentos

Caso general: Quiero un evento de IU en un Fragmento para realizar cambios en toda la actividad.

Caso específico: Tengo dos fragmentos alojados en la misma actividad. Cuando el usuario hace clic en un botón en uno de esos fragmentos, quiero que sea reemplazado por el otro.

I no quiero, sin embargo, mis Fragmentos tocan mi actividad. Es posible que desee cambiar el comportamiento más tarde (tal vez, en una pantalla más grande, mostrar 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 informa eventos al Activity. De esta forma, si quiero usar otra clase Activity con un comportamiento de visualización diferente, puedo simplemente cambiar el oyente y dejar intacto el código Fragment.

¿Es esta una buena manera de hacerlo? ¿Hay una buena práctica estándar o un mejor patrón de diseño?

Respuesta

12

El uso de oyentes es la forma recomendada de comunicación entre Fragment y su actividad.

Consulte esto Android documentatin section para infromation. Para abreviar, simplemente implementan una interfaz de escucha por la clase Activity y lanzan getActivity() como resultado un fragmento para un oyente.

Desde mi experiencia personal esto es muy conveniente porque permite:

  1. interruptor Facilmente actividad subyacente (por ejemplo, aloja toda fragmento en una actividad de envoltura para la compatibilidad en pre-3.0 y el anfitrión este fragmento, junto con los demás en 11+)
  2. Controla fácilmente si la actividad del wrapper admite callbacks o no. Simplemente compruebe si implementa el oyente y realice las acciones específicas de su aplicación si no lo hace.
2

Estás en lo cierto acerca de usar un Oyente. Esto es algo con lo que también tuve que lidiar en un proyecto en el trabajo. La mejor manera de manejarlo es hacer que el Fragmento sea autónomo en la naturaleza. Todo lo que desee interactuar con el Fragmento debe usar su API pública y/o configurar oyentes para eventos específicos. Si está familiarizado con Design Patterns, este es el Observer pattern. Los eventos pueden ser generales o específicos, así como contener datos o sin datos.

Como ejemplo de mi proyecto, tenía dos Fragmentos. Un ListFragment y un InfoFragment que muestran el ListItem seleccionado. ListFragment ya tiene una interfaz de Escucha para que mi Actividad se enganche, pero el InfoFragmento no lo hace, ya que es su Fragmento básico. Agregué una interfaz de Escucha al InfoFragmento que sería notificado cuando el Fragmento quisiera cerrar. Para el Fragmento, esto podría ser presionando un botón, o se podría producir una acción específica, pero en lo que se refiere a mi Actividad, cuando se desencadena el Evento, cerraría la vista del Fragmento.

No tenga miedo de utilizar muchos Listeners for Fragments, pero también intente agruparlos mediante una acción específica usando los parámetros de datos para individualizarlos. ¡Espero que esto ayude!

+1

estoy experimentando un problema similar. Tengo una FragmentActivity que se administra a través de tabhost 4 listfragments y cada ListFragment podría, en función de la interacción del usuario, lanzar otros fragmentos (todos los fragmentos comparten el mismo diseño donde se muestra su contenido). ¿Sigue siendo válido el patrón de devolución de llamada? gracias – Blackbelt

+1

Sí, el patrón de devolución de llamada sería perfecto para esto. Deje que la Actividad haga ese lanzamiento escuchando todos los fragmentos – Spidy

0

una respuesta técnica para:

Tengo dos fragmentos, alojada en la misma actividad. Cuando el usuario hace clic en un botón en 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(); 
0
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(); 
        } 
    } 
Cuestiones relacionadas