¿Por qué fragmentos y cuándo usar fragmentos en lugar de actividades?

485

En Android API 11+, Google lanzó una nueva clase llamada Fragment.

En los videos, Google sugiere que siempre que sea posible ( enlace1 , enlace2 ), deberíamos usar fragmentos en lugar de actividades, pero no explicaron exactamente por qué.

¿Cuál es el propósito de los fragmentos y algunos usos posibles de ellos (aparte de algunos ejemplos de IU que se pueden lograr fácilmente mediante vistas / diseños simples)?

Mi pregunta es sobre fragmentos:

  1. ¿Cuáles son los propósitos de usar un fragmento?
  2. ¿Cuáles son las ventajas y desventajas de usar fragmentos en comparación con el uso de actividades / vistas / diseños?

Preguntas extra:

  1. ¿Puedes dar algunos usos realmente interesantes para los fragmentos? ¿Cosas que Google no mencionó en sus videos?
  2. ¿Cuál es la mejor manera de comunicarse entre fragmentos y las actividades que los contienen?
  3. ¿Cuáles son las cosas más importantes para recordar cuando usas fragmentos? ¿Algún consejo y advertencia de tu experiencia?
desarrollador de Android
fuente

Respuestas:

282

# 1 y # 2 ¿cuáles son los propósitos de usar un fragmento y cuáles son las ventajas y desventajas de usar fragmentos en comparación con el uso de actividades / vistas / diseños?

Los fragmentos son la solución de Android para crear interfaces de usuario reutilizables. Puede lograr algunas de las mismas cosas usando actividades y diseños (por ejemplo, usando incluye). Sin embargo; los fragmentos están conectados a la API de Android, desde HoneyComb, y hasta. Déjame elaborar;

  • El ActionBar. Si desea pestañas para navegar por su aplicación, verá rápidamente que la ActionBar.TabListenerinterfaz le ofrece FragmentTransactionun argumento de entrada para el onTabSelectedmétodo. Probablemente podría ignorar esto y hacer algo más e inteligente, pero estaría trabajando en contra de la API, no con ella.

  • Las FragmentManagerasas "vuelven" para usted de una manera muy inteligente. Volver no significa volver a la última actividad, como en las actividades regulares. Significa volver al estado del fragmento anterior.

  • Puede usar el cool ViewPagercon un FragmentPagerAdapterpara crear interfaces de deslizamiento. El FragmentPagerAdaptercódigo es mucho más limpio que un adaptador normal y controla las instancias de los fragmentos individuales.

  • Su vida será mucho más fácil si usa Fragmentos cuando intenta crear aplicaciones para teléfonos y tabletas. Dado que los fragmentos están tan vinculados con las API Honeycomb +, también querrá usarlos en los teléfonos para reutilizar el código. Ahí es donde la biblioteca de compatibilidad es útil.

  • Incluso podría y debería usar fragmentos para aplicaciones destinadas solo a teléfonos. Si tienes portabilidad en mente. Utilizo ActionBarSherlocky las bibliotecas de compatibilidad para crear aplicaciones "con aspecto de ICS", que se ven igual desde la versión 1.6. Obtiene las últimas funciones como ActionBar, con pestañas, desbordamiento, barra de acción dividida, visor, etc.

Bono 2

La mejor manera de comunicarse entre fragmentos son los intentos. Cuando presionas algo en un Fragmento, normalmente llamas StartActivity()con datos sobre él. La intención se pasa a todos los fragmentos de la actividad que inicias.

Glenn Bech
fuente
55
antes que nada, gracias. Aprecio a las personas que dan respuestas informativas (pero cortas) y no solo me dan un enlace a un manual. De todos modos, además de las características adicionales para trabajar en clases especiales, ¿puedes pensar en las ventajas y desventajas de trabajar con fragmentos? ?
Desarrollador de Android
44
Creo que tienes que ser más directo en tus preguntas. Acabo de dar cuatro ventajas principales arriba.
Glenn Bech
2
ok, ¿qué pasa con las desventajas en comparación con las vistas y actividades personalizadas?
Desarrollador de Android
2
¿Cómo te comunicas entre fragmentos usando intentos? ¿Todos los fragmentos deben estar "vivos" (agregados a la actividad) para que puedan comunicarse entre sí?
Desarrollador de Android el
55
Un fragmento nunca debe hablar directamente con otro fragmento; en su lugar, realice la actividad principal. De esta manera, no terminas con el código de espagueti sino con un código fácil de administrar.
slott
70

No estoy seguro de a qué video (s) se refiere, pero dudo que digan que debe usar fragmentos en lugar de actividades, porque no son directamente intercambiables. En realidad, hay una entrada bastante detallada en la Guía de desarrollo, considere leerla para obtener más detalles.

En resumen, los fragmentos viven dentro de las actividades, y cada actividad puede albergar muchos fragmentos. Al igual que las actividades, tienen un ciclo de vida específico, a diferencia de las actividades, no son componentes de aplicaciones de nivel superior. Las ventajas de los fragmentos incluyen la reutilización de código y la modularidad (por ejemplo, usar la misma vista de lista en muchas actividades), incluida la capacidad de construir interfaces de paneles múltiples (principalmente útiles en tabletas). La principal desventaja es (alguna) complejidad añadida. En general, puede lograr lo mismo con vistas (personalizadas) de una manera no estándar y menos robusta.

Nikolay Elenkov
fuente
1
pregunta actualizada ahora tiene enlaces a los videos de google. También, gracias por la explicación, pero aún necesito aclaraciones sobre mi pregunta.
Desarrollador de Android
55
Lea la entrada de la guía de desarrollo, tiene más que suficientes detalles. Es poco probable que obtenga una respuesta a 'usos geniales de fragmentos' en SO, demasiado vago y no hay una respuesta única. El número 4 se responde específicamente en la guía de desarrollo-- developer.android.com/guide/topics/fundamentals/…
Nikolay Elenkov
1
Que yo sepa, este método crea una dependencia de qué actividad puede contener qué fragmento. Además, responda las preguntas principales (las dos primeras).
Desarrollador de Android
3
Gracias al desarrollador de Android por insistir en las respuestas a la pregunta básica. ATM No he visto nada útil para mí en la clase Fragment sobre el uso de la etiqueta XML "include". El tipo de cosas que me parecerían valiosas sería la capacidad de especificar un diseño que se transformaría mágicamente en la mejor experiencia de usuario en todas las resoluciones. Por lo que puedo decir, aún debe hacer eso en código usted mismo. Otro valor potencial sería una forma de agrupar código + recursos en componentes reutilizables que no se encuentran en las aplicaciones de reutilización, pero de nuevo no parece estar allí. Quiero una muy buena razón.
Melinda Green
2
Estoy empezando a entender la forma en que Google sugiere usar fragmentos, pero estoy bastante de acuerdo con @NikolayElenkov ... Para mí, el uso de Actividades todavía parece ser la forma más sólida y menos compleja ...
andrea.rinaldi
49

Un Fragmento es una parte de la interfaz de usuario o el comportamiento de una aplicación que se puede colocar en una Actividad que permite un diseño de actividad más modular. No estará mal si decimos que un fragmento es una especie de subactividad.

Los siguientes son puntos importantes sobre un fragmento:

  1. Un fragmento tiene su propio diseño y su propio comportamiento con sus propias devoluciones de llamada del ciclo de vida.

  2. Puede agregar o eliminar fragmentos en una actividad mientras se ejecuta la actividad.

  3. Puede combinar varios fragmentos en una sola actividad para crear una IU de paneles múltiples.

  4. Un fragmento puede usarse en múltiples actividades.

  5. El fragmento del ciclo de vida está estrechamente relacionado con el ciclo de vida de su actividad de acogida.

  6. Cuando la actividad está en pausa, todos los fragmentos disponibles en la actividad también se detendrán.

  7. Un fragmento puede implementar un comportamiento que no tiene un componente de interfaz de usuario.

  8. Se agregaron fragmentos a la API de Android en Android 3 (Honeycomb) con API versión 11.

Para más detalles, visite el sitio oficial, Fragments .

mani
fuente
1. Como mencionó en el n. ° 8, no tiene que tener un diseño. 6. te perdiste la parte después de "significa". De todos modos, gracias por ayudar a otros a aclarar esto. Te daré +1.
Desarrollador de Android
1
Con respecto al n. ° 8, un posible ejemplo de fragmento sin diseño (es decir, fragmento 'sin cabeza') sería aquel que lleva a cabo una tarea que a pesar de ser algo corta (como una solicitud HTTP corta) aún se requiere para sobrevivir a los cambios de configuración y, por lo tanto, depende en la instancia exacta del fragmento que se conserva en ellos (mediante el uso de setRetainInstance (true) en el fragmento). En cuanto a los fragmentos de diseño, setRetainInstance (true) no tiene mucho sentido, ya que evita que los recursos asociados con sus vistas se liberen cuando sea necesario (es decir, una pérdida de memoria).
Piovezan
NOTA: "# 8" ahora es "# 7".
ToolmakerSteve
21

Esta es información importante que encontré en fragmentos:

Históricamente, cada pantalla en una aplicación de Android se implementaba como una Actividad separada. Esto crea un desafío al pasar información entre pantallas porque el mecanismo de Intención de Android no permite pasar un tipo de referencia (es decir, un objeto) directamente entre Actividades. En cambio, el objeto debe ser serializado o una referencia accesible globalmente disponible.

Al hacer que cada pantalla sea un Fragmento separado, se evita por completo este dolor de cabeza que pasa la información. Los fragmentos siempre existen dentro del contexto de una Actividad dada y siempre pueden acceder a esa Actividad. Al almacenar la información de interés dentro de la Actividad, el Fragmento para cada pantalla simplemente puede acceder a la referencia del objeto a través de la Actividad.

Fuente: https://www.pluralsight.com/blog/software-development/android-fragments

Kaveesh Kanwal
fuente
3
Eso es cierto, pero hay soluciones para esto: use Parcelable cuando no sea un objeto enorme (y hay un complemento para hacerlo más fácil), y si es un objeto enorme, siempre puede usar una referencia estática que se establecerá en nulo cuando llegue a la nueva actividad (o cuando la destruya, según sus requisitos).
Desarrollador de Android
@androiddeveloper: "use Parcelable" se ajusta a mi definición de "dolor de cabeza que pasa datos que se evita mediante el uso de fragmentos". Si hay un estado compartido complejo que necesita persistir mientras pasa una serie de pantallas, una Actividad + Fragmentos es una buena solución, en mi humilde opinión. (Aunque abandoné la pila de fragmentos Fragment e hice mi propia gestión de lo que significa "back".)
ToolmakerSteve
El uso del patrón de diseño de interfaz entre fragmentos a través de una actividad de contenedor es un enfoque mucho más modular para pasar no solo objetos, sino también hacer clic en escuchas de eventos y argumentos de métodos a otros fragmentos o a la actividad del contenedor principal.
Kaveesh Kanwal
10

Las actividades son los componentes de pantalla completa en la aplicación con la barra de herramientas, todo lo demás son preferiblemente Fragmentos. Una actividad principal de pantalla completa con una barra de herramientas puede tener múltiples paneles, páginas desplazables, cuadros de diálogo, etc. (todos los fragmentos), a todos los cuales se puede acceder desde el padre y comunicarse a través del padre.

Ejemplo:

Actividad A, Actividad B, Actividad C:

  • Todas las actividades deben tener el mismo código repetido, para mostrar una barra de herramientas básica, por ejemplo, o heredar de una actividad principal (se vuelve difícil de manejar).
  • Para pasar de una actividad a otra, o bien todas deben estar en la memoria (sobrecarga) o una debe ser destruida para que la otra se abra.
  • La comunicación entre actividades se puede hacer a través de Intentos.

vs

Actividad A, Fragmento 1, Fragmento 2, Fragmento 3:

  • Sin repetición de código, todas las pantallas tienen barras de herramientas, etc. de esa actividad.
  • Varias formas de pasar de un fragmento al siguiente: ver localizador, panel múltiple, etc.
  • La actividad tiene la mayoría de los datos, por lo que se necesita una comunicación mínima entre fragmentos. Si aún es necesario, se puede hacer a través de interfaces fácilmente.
  • Los fragmentos no necesitan estar en pantalla completa, hay mucha flexibilidad para diseñarlos.
  • Los fragmentos no necesitan inflar el diseño si las vistas no son necesarias.
  • Varias actividades pueden usar el mismo fragmento.
Chandrima Bhattacharjee
fuente
¡Respuesta perfecta!
Sábado
8

Los fragmentos son de uso particular en algunos casos, como cuando queremos mantener un cajón de navegación en todas nuestras páginas. Puede inflar un diseño de marco con cualquier fragmento que desee y aún tener acceso al cajón de navegación.

Si hubiera utilizado una actividad, habría tenido que mantener el cajón en todas las actividades que generan código redundante. Este es un uso interesante de un fragmento.

Soy nuevo en Android y sigo pensando que un fragmento es útil de esta manera.

Nithin Baby
fuente
Si. Sin embargo, a veces todavía estoy confundido acerca de la forma correcta de usar fragmentos, y eso se debe al complejo ciclo de vida de los fragmentos y las actividades.
Desarrollador de Android
@androiddeveloper ¿usas actividades principalmente?
Michael Alan Huff
@MichaelAlanHuff Cuando se admiten tabletas, creo que es mejor usar Fragments. Además, al admitir cambios de orientación y otros eventos similares, es posible que desee utilizar DialogFragment, ya que le permite restaurarlos
desarrollador de Android
@androiddeveloper, eso es lo que pienso también. No he usado DialogFragments con tanta frecuencia. Para ayudar a la modularidad de la lógica, muchos desarrolladores de Android están comenzando a usar vistas personalizadas para mantener la lógica al mortero. Aquí hay una charla reciente sobre vistas personalizadas dada por un ingeniero de Airbnb vimeo.com/127799187
Michael Alan Huff
@MichaelAlanHuff usando fragmentos también podría ser útil si cree que la pantalla actual podría ser parte de otra pantalla.
Desarrollador de Android
5

Sé que esto ya se discutió hasta la muerte, pero me gustaría agregar algunos puntos más:

  • Los frags se pueden usar para rellenar Menusy pueden manejar MenuItemclics por su cuenta. Dando así más opciones de modulación para sus actividades. Puede hacer cosas de ContextualActionBar y así sucesivamente sin que su Actividad lo sepa y básicamente puede desacoplarlo de las cosas básicas que maneja su Actividad (Navegación / Configuración / Acerca de).

  • Un Frag principal con Frags secundarios puede brindarle más opciones para modular sus componentes. Por ejemplo, puede intercambiar Frags fácilmente, colocar Frags nuevos dentro de un Buscapersonas o eliminarlos, reorganizarlos. Todo sin que su Actividad sepa nada al respecto, solo se centra en las cosas de nivel superior.

einschnaehkeee
fuente
0

Fragments vive dentro de la Actividad y tiene:

  • su propio ciclo de vida
  • su propio diseño
  • sus propios fragmentos hijos y etc.

Piense en los Fragmentos como una sub-actividad de la actividad principal a la que pertenece, no puede existir por sí misma y puede ser llamada / reutilizada una y otra vez. Espero que esto ayude :)

maniix
fuente
En realidad, sobre el segundo punto ("su propio diseño"), esto es opcional. Un fragmento no tiene que tener una vista en absoluto.
Desarrollador de Android
0

1.Propósitos de usar un fragmento?

  • Respuesta:
    1. Tratamiento de las diferencias de factor de forma del dispositivo.
    2. Transmitir información entre pantallas de aplicaciones.
    3. Organización de la interfaz de usuario.
    4. Metáforas de IU avanzadas.
Prithiv Dharmaraj
fuente
0

Un fragmento vive dentro de una actividad, mientras que una actividad vive sola.

superkytoz
fuente
66
"en sí mismo"? ¿Quizás "por sí solo"? O "por sí mismo"?
Peter Mortensen el