Sé que Activities
están diseñados para representar una sola pantalla de mi aplicación, mientras que Fragments
están diseñados para ser diseños de IU reutilizables con lógica incrustada dentro de ellos.
Hasta hace poco, desarrollé una aplicación que decía que deberían desarrollarse. Creé un Activity
para representar una pantalla de mi aplicación y utilicé Fragments para ViewPager
o Google Maps
. Raramente creé una ListFragment
u otra interfaz de usuario que se pueda reutilizar varias veces.
Recientemente me topé con un proyecto que contiene solo 2, Activities
uno es a SettingsActivity
y otro es el MainActivity
. El diseño de la MainActivity
se rellena con muchos fragmentos de IU de pantalla completa ocultos y solo se muestra uno. En la Activity
lógica hay muchas 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 un ActionBar
, permanece intacta y no se mueve con la animación de cambio de pantalla, que es lo que sucede con el Activity
cambio. Esto le da una sensación más fluida a esas transiciones de pantalla.
Así que supongo que lo que pido es compartir su manera actual de desarrollo con respecto a este tema, sé que podría parecer una pregunta basada en la opinión a primera vista, pero lo veo como una pregunta de diseño y arquitectura de Android ... opinión basada en uno.
ACTUALIZACIÓN (01.05.2014): después de esta presentación de Eric Burke de Square , (lo que tengo que decir 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 durante los últimos meses, descubrí que la mejor manera de construir mis aplicaciones es crear grupos de fragmentos que representen un flujo en la aplicación y presenten todos esos fragmentos en uno Activity
. Entonces, básicamente, tendrá el mismo número de Activities
aplicaciones que el número de flujos. De esa manera, la barra de acción permanece intacta en todas las pantallas del flujo, pero se recrea al cambiar un flujo que tiene mucho sentido. Como Eric Burke afirma y como también me he dado cuenta, la filosofía de usar la menor cantidad Activities
posible no es aplicable para todas las situaciones porque crea un desastre en lo que él llama la actividad "Dios".
Respuestas:
Los expertos le dirán: "Cuando vea la interfaz de usuario, sabré si usar una
Activity
o unaFragment
". Al principio esto no tendrá ningún sentido, pero con el tiempo, podrá saber si lo necesitaFragment
o no.Hay una buena práctica que me pareció muy útil. Se me ocurrió mientras intentaba explicarle algo a mi hija.
A saber, imagine una caja que representa una pantalla. ¿Puedes cargar otra pantalla en este cuadro? Si usa una nueva casilla, ¿tendrá que copiar varios elementos de la primera casilla? Si la respuesta es Sí, entonces debe usar
Fragments
, porque la raízActivity
puede contener todos los elementos duplicados para ahorrar tiempo al crearlos, y simplemente puede reemplazar partes de la caja.Pero no olvide que siempre necesita un contenedor de caja (
Activity
) o sus partes se dispersarán. Entonces una caja con partes adentro.Tenga cuidado de no usar mal la caja. Los expertos de Android UX aconsejan (puede encontrarlos en YouTube) cuándo debemos cargar explícitamente otro
Activity
, en lugar de usar unFragment
(como cuando tratamos con el cajón de navegación que tiene categorías). Una vez que te sientas cómodoFragments
, puedes ver todos sus videos. Aún más son material obligatorio.¿Puedes ahora mirar tu interfaz de usuario y averiguar si necesitas una
Activity
o unaFragment
? ¿Obtuviste una nueva perspectiva? Creo que lo hiciste.fuente
Mi filosofía es esta:
Cree una actividad solo si es absolutamente necesaria. Con la pila posterior disponible para confirmar un montón de transacciones fragmentarias, intento crear la menor cantidad de actividades posible en mi aplicación. Además, la comunicación entre varios fragmentos es mucho más fácil que enviar datos entre las actividades.
Las transiciones de actividad son caras, ¿verdad? Al menos eso creo, ya que la antigua actividad tiene que ser destruida / pausada / detenida, empujada a la pila, y luego la nueva actividad tiene que ser creada / iniciada / reanudada.
Es solo mi filosofía desde que se introdujeron los fragmentos.
fuente
onActivityResult()
es más seguro y más fácil que las devoluciones de llamada de fragmentos.Bueno, de acuerdo con las conferencias de Google (tal vez aquí , no lo recuerdo), deberías considerar usar Fragments siempre que sea posible, ya que hace que tu código sea más fácil de mantener y controlar.
Sin embargo, creo que en algunos casos puede volverse demasiado complejo, ya que la actividad que alberga 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 desea leer más.
fuente
Por qué prefiero Fragmento a Actividad en TODOS LOS CASOS.
La actividad es cara. En Fragment, las vistas y los estados de propiedad están separados: cada vez que se encuentre un fragmento
backstack
, sus vistas se destruirán. Entonces puedes apilar muchos más fragmentos que actividad.Backstack
manipulación. ConFragmentManager
, 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 ciclo de vida mucho más predecible . Siempre que la Actividad del host no se recicle. Los fragmentos en el backstack no serán reciclados. Por lo tanto, es posible utilizar
FragmentManager::getFragments()
para encontrar un fragmento específico (no recomendado).fuente
Desde Jetpack , la aplicación Single-Activity es la arquitectura preferida. Útil especialmente con el componente de arquitectura de navegación .
fuente
fuente
En mi opinión, no es realmente relevante. El factor clave a considerar es
El uso principal de los fragmentos es crear actividades multipane, lo que lo hace perfecto para aplicaciones sensibles a tabletas / teléfonos.
fuente
¡No olvide que una actividad es el bloque / componente de la aplicación que se puede compartir e iniciar 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 resuelvan otras tareas. Este enfoque será una 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. Usted define tareas en la etapa de diseño del proceso de desarrollo en función de los requisitos.
fuente
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, comience la actividad de esa página y destruya la actual. Esto causa mucha sobrecarga. La mejor guía que puedo darte es:
** Inicie una nueva actividad solo si tiene sentido tener la actividad principal y esta abierta al mismo tiempo (piense en varias ventanas).
Un gran 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 quizás incluso abrir otro documento en paralelo al primero.
fuente
attach
/detach
métodos.Cosa que hice: usar menos fragmentos cuando sea posible. Desafortunadamente, es posible en casi todos los casos. Entonces, termino con muchos fragmentos y un poco de actividades. Algunos inconvenientes que me di cuenta:
ActionBar
& Menú: cuando 2 fragmentos tienen un título, menú diferente, esoserá difícil de manejar. Por ejemplo: al agregar un nuevo fragmento, puede cambiar el título de la barra de acción, pero al abrirlo desde
backstack
allí 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 llevará más tiempo.startForResult
, la actividad tiene pero el fragmento no.Mi solución para esto es usar una Actividad para envolver un fragmento dentro. Entonces tenemos una barra de acción separada, menú
startActivityForResult
, animación, ...fuente
getSupportFragmentManager().addOnBackStackChangedListener
para agregar un oyente. obtener fragmento actual en ese oyente y luego establecer el título y esas cosas.La gran ventaja de una
fragment
sobreactividad es que, el código que se usa para fragmentos puede usarse para diferentes actividades. Por lo tanto, proporciona la reutilización del código en el desarrollo de aplicaciones.fuente
use una actividad por aplicación para proporcionar una base para el
fragment
usofragment
de la pantalla,fragments
tienen un peso reducido en comparación con losactivites
fragmentos, los fragmentos reutilizables son más adecuados para aplicaciones que admiten teléfonos y tabletasfuente
Eres libre de usar uno de esos.
Básicamente, debes evaluar cuál es el mejor para tu aplicación. Piense en cómo administrará el flujo de negocios y cómo almacenar / administrar las preferencias de datos.
Piense en cómo los Fragmentos almacenan datos basura. Cuando implementa el fragmento, tiene una raíz de actividad para llenar con fragmento (s). Entonces, si está tratando de implementar muchas actividades con demasiados fragmentos, debe considerar el rendimiento en su aplicación, porque está manipulando (habla groseramente) el ciclo de vida de dos contextos, recuerde la complejidad.
Recuerde: ¿debo usar fragmentos? ¿Por qué no debería?
Saludos.
fuente
Utilizo Fragments para una mejor experiencia de usuario. Por ejemplo, si tiene un Botón y desea ejecutarlo, digamos un servicio web cuando hace clic en él, adjunto un Fragmento a la Actividad principal.
De esa manera, el usuario no tendrá que moverse en otra actividad.
Y en segundo lugar, prefiero Fragments porque puedes manejarlos fácilmente durante la rotación.
fuente
Depende de lo que quieras construir realmente. Por ejemplo,
navigation drawer
utiliza fragmentos. Las pestañas también se usanfragments
. Otra buena implementación, es donde tienes unlistview
. Cuando gira el teléfono y hace clic en una fila, la actividad se muestra en la mitad restante de la pantalla. Personalmente, lo usofragments
yfragment dialogs
, como es más profesional. Además, se manejan más fácilmente en rotación.fuente