Pregunta

Esta es una pregunta de diseño, en lugar de una técnica.

Caso general: Quiero un evento de UI en un fragmento para hacer 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.

yo no quiero, sin embargo, mis fragmentos tocando mi actividad. Es posible que quiera cambiar el comportamiento más adelante (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 un Listener clase en mis fragmentos, que informan los eventos de regreso al Activity. De esta manera, si quiero usar otro Activity clase con un comportamiento de pantalla diferente, puedo cambiar el oyente y dejar el Fragment código intacto.

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

¿Fue útil?

Solución

El uso de oyentes es la forma recomendada de comunicarse entre fragmento y su actividad.

Mira esto Sección de documentos de Android para infrominar. En pocas palabras, simplemente implementan una interfaz de oyente de la clase de actividad y emiten getActivity () dan como resultado un fragmento para un oyente.

De mi experiencia personal, esto es muy conveniente porque le permite:

  1. Easilly Switch Actividad subyacente (por ejemplo, aloja un fragmento completo en una actividad de envoltura para la compatibilidad en Pre-3.0 y aloja este fragmento junto con otros en 11+)
  2. Control de Easilly si la actividad de envoltura admite devoluciones de llamada o no. Solo verifique si implementa el oyente y realiza acciones específicas de su aplicación si no es así.

Otros consejos

Tienes razón sobre el uso de 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 independiente en la naturaleza. Cualquier cosa que desee interactuar con el fragmento debe usar su API pública y/o los oyentes establecer eventos específicos. Si estás familiarizado con 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, tenía dos fragmentos. Un Fragment de List y un InfoFragment que mostró el ListItem seleccionado. ListFragment ya tiene una interfaz del oyente para que mi actividad se conecte, pero el InfoFragment no lo hace desde su fragmento básico. Agregué una interfaz del oyente al InfoFragment que se notificaría cuando el fragmento quería cerrar. Para el fragmento, esto podría ser mediante un botón de presionar o ocurrió una acción específica, pero en lo que respecta a mi actividad, cuando se activa el evento, cerraría la vista del fragmento.

No tenga miedo de usar muchos oyentes para fragmentos, pero también intente agruparlos mediante una acción específica utilizando 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 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();
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();
                     }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top