Pregunta Dilema: cuándo usar Fragmentos vs Actividades:


Yo sé eso Activities están diseñados para representar una sola pantalla de mi aplicación, mientras Fragments están diseñados para ser diseños de UI reutilizables con lógica integrada dentro de ellos.

Hasta no hace mucho tiempo, desarrollé una aplicación porque decía que deberían desarrollarse. Creé un Activity para representar una pantalla de mi aplicación y utilicé Fragmentos para ViewPager o Google Maps. Raramente creo un ListFragment u otra IU que se puede reutilizar varias veces.

Recientemente me encontré con un proyecto que contiene solo 2 Activities uno es un SettingsActivity y otro es el MainActivity. El diseño de la MainActivity está lleno de muchos fragmentos ocultos de UI de pantalla completa y solo se muestra uno. En el Acitivty lógica hay muchos FragmentTransitions entre las diferentes pantallas de la aplicación.

Lo que me gustó de este enfoque es que debido a que la aplicación usa una ActionBar, se mantiene intacto y no se mueve con la animación de cambio de pantalla, que es lo que sucede con Activity traspuesta. Esto da una sensación más fluida a esas transiciones de pantalla.

Así que supongo que lo que estoy pidiendo es que compartas tu actual forma de desarrollo con respecto a este tema, sé que podría parecer una pregunta basada en opinión a primera vista, pero lo veo como una cuestión de diseño y arquitectura de Android ... No es realmente una basado en opinión.

ACTUALIZACIÓN (01.05.2014): Después de esta presentación por Eric Burke de Cuadrado, (que tengo que decir que es una gran presentación con muchas herramientas útiles para desarrolladores de Android. Y no estoy relacionado de ninguna manera con Square)

http://www.infoq.com/presentations/Android-Design/

Desde mi experiencia personal en los últimos meses, encontré que la mejor manera de construir mis aplicaciones es crear grupos de fragmentos que representen un fluir en la aplicación y presente todos esos fragmentos en uno Activity. Entonces, básicamente, tendrás el mismo número de Activities en su aplicación como el número de flujos. De esta forma, la barra de acciones permanece intacta en todas las pantallas de flujo, pero se recrea al cambiar un flujo que tiene mucho sentido. Como dice Eric Burke y como también me he dado cuenta, la filosofía de usar tan pocos Activities como sea posible no es aplicable para todas las situaciones porque crea un desastre en lo que él llama la actividad "Dios".


650
2017-11-30 21:53


origen


Respuestas:


Los expertos le dirán: "Cuando vea la IU, sabré si debo usar un Activity o una Fragment"Al principio, esto no tendrá sentido, pero con el tiempo, en realidad podrás saber si necesitas Fragment o no.

Hay una buena práctica que encontré muy útil para mí. Se me ocurrió mientras intentaba explicarle algo a mi hija.

A saber, imagine una caja que representa una pantalla. ¿Puedes cargar otra pantalla en esta casilla? Si usa una nueva caja, ¿tendrá que copiar varios artículos de la 1ra casilla? Si la respuesta es Sí, entonces debes usar Fragments, porque la raíz Activity puede contener todos los elementos duplicados para ahorrarle tiempo al crearlos, y simplemente puede reemplazar partes de la caja.

Pero no lo olvides que siempre necesitas un contenedor de caja (Activity) o sus partes serán dispersadas. Entonces una caja con partes adentro.

Tenga cuidado de no hacer mal uso de la caja. Los expertos de Android UX aconsejan (puedes encontrarlos en YouTube) cuando deberíamos cargar explícitamente otro Activity, en lugar de usar un Fragment (como cuando tratamos con el Cajón de navegación que tiene categorías). Una vez que te sientas cómodo con Fragments, puedes ver todos sus videos. Aún más son material obligatorio.

¿Puedes mirar ahora tu UI y averiguar si necesitas una Activity o una Fragment? ¿Obtuviste una nueva perspectiva? Creo que lo hiciste


216
2017-09-23 10:42



Mi filosofía es esta:

Crea una actividad solo si es absolutamente necesario. Con el backstack disponible para cometer un montón de transacciones de fragmentos, trato de crear un mínimo de actividades en mi aplicación como sea posible. Además, la comunicación entre varios fragmentos es mucho más fácil que enviar datos de ida y vuelta entre actividades.

Las transiciones de actividad son costosas, ¿verdad? Al menos eso creo, dado que la actividad anterior se destruyó / pausó / detuvo, se empujó a la pila y luego la nueva actividad se debe crear / iniciar / reanudar.

Es solo mi filosofía desde que se introdujeron los fragmentos.


100
2017-11-30 23:02



Bueno, según las conferencias de Google (tal vez aquí, No recuerdo), debería considerar usar Fragmentos siempre que sea posible, ya que hace que su código sea más fácil de mantener y controlar.

Sin embargo, creo que en algunos casos puede ser demasiado complejo, ya que la actividad que aloja los fragmentos necesita navegar / comunicarse entre ellos.

Creo que deberías decidir por ti mismo qué es lo mejor para ti. Por lo general, no es tan difícil convertir una actividad en un fragmento y viceversa.

He creado una publicación sobre este dillema aquí, si deseas leer más.


45
2017-11-30 22:16



Por qué prefiero Fragmento a Actividad en TODOS LOS CASOS.

  • La actividad es costosa En Fragment, las vistas y los estados de propiedades están separados, siempre que se encuentre un fragmento backstack, sus puntos de vista serán destruidos. Entonces puedes apilar muchos más Fragmentos que Actividad.

  • Backstack manipulación. Con FragmentManager, es fácil borrar todos los Fragmentos, insertar más que en Fragmentos y etc. Pero para Activity, será una pesadilla manipular esas cosas.

  • Un tanto predecible ciclo vital. Siempre que la actividad del anfitrión no sea reciclada. los Fragmentos en la backstack no serán reciclados. Entonces es posible usar FragmentManager::getFragments() para encontrar Fragmento específico (no recomendado).


19
2017-12-03 12:47



En mi opinión, no es realmente relevante. El factor clave a considerar es

  1. con qué frecuencia reutilizará partes de la IU (menús, por ejemplo),
  2. es la aplicación también para tabletas?

El principal uso de los fragmentos es crear actividades multipane, lo que lo hace perfecto para aplicaciones sensibles a Tablet / Phone.


9
2018-03-12 22:41



Hay más en esto de lo que cree, debe recordar que una actividad que se inicia no destruye implícitamente la actividad de llamada. Claro, puede configurarlo de modo que su usuario haga clic en un botón para ir a una página, inicie la actividad de esa página y destruya la actual. Esto causa una gran sobrecarga. La mejor guía que puedo darte es:

** Comience una nueva actividad solo si tiene sentido tener la actividad principal y esta abierta al mismo tiempo (piense en varias ventanas).

Un buen ejemplo de cuándo tiene sentido tener múltiples actividades es Google Drive. La actividad principal proporciona un explorador de archivos. Cuando se abre un archivo, se inicia una nueva actividad para ver ese archivo. Puede presionar el botón de aplicaciones recientes que le permitirá volver al navegador sin cerrar el documento abierto, y tal vez incluso abrir otro documento en paralelo al primero.


7
2017-08-05 14:27



¡No olvide que una actividad es el bloque / componente de la aplicación que puede compartirse e iniciarse a través de Intent! Por lo tanto, cada actividad en su aplicación debe resolver solo un tipo de tarea. Si solo tiene una tarea en su aplicación, creo que solo necesita una actividad y muchos fragmentos si es necesario. Por supuesto, puede reutilizar fragmentos en actividades futuras que resuelven otras tareas. Este enfoque será la separación clara y lógica de las tareas. Y no es necesario mantener una actividad con diferentes parámetros de filtro de intención para diferentes conjuntos de fragmentos. Define tareas en la etapa de diseño del proceso de desarrollo según los requisitos.


6
2018-02-02 16:15



Cosa que hice: usar menos fragmentos cuando sea posible. Desafortunadamente, es posible en casi casos. Entonces, termino con muchos fragmentos y un poco de actividades. Algunos inconvenientes que me he dado cuenta:

  • ActionBar Y Menú: cuando 2 fragmento tiene un título, menú diferente,
       será difícil de manejar. Por ejemplo, al agregar un nuevo fragmento, puede cambiar el título de la barra de acciones, pero cuando lo muestra backstack no hay forma de restaurar el título anterior. Es posible que necesite una barra de herramientas en cada fragmento para este caso, pero créame, eso le hará perder más tiempo.
  • Cuando necesitamos startForResult, la actividad tiene pero el fragmento no tiene.
  • No tiene animación de transición por defecto

Mi solución para esto es usar una Actividad para envolver un fragmento adentro. Entonces tenemos una barra de acciones separada, menú, startActivityForResult, animación, ...


5
2017-11-18 03:01



La gran ventaja de una fragment sobre la actividad es que, el código que se utiliza para el fragmento se puede utilizar para diferentes actividades. Por lo tanto, proporciona reutilizabilidad de código en el desarrollo de aplicaciones.


2
2018-06-09 19:38



Uso Fragmentos para una mejor experiencia de usuario. Por ejemplo, si tiene un Botón y desea ejecutar digamos un servicio web cuando hace clic en él, adjunto un Fragmento a la Actividad principal.

if (id == R.id.forecast) {

    ForecastFragment forecastFragment = new ForecastFragment();
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.main_content, forecastFragment);
    ft.addToBackStack("backstack");
    forecastFragment.setArguments(b);
    ft.commit();
}

De esta forma, el usuario no tendrá que moverse en otra actividad.

Y en segundo lugar, prefiero Fragmentos porque puedes manejarlos fácilmente durante la rotación.


0
2018-05-29 08:37