¿Cuál es el beneficio de usar Fragmentos en Android, en lugar de Vistas?

Al desarrollar para Android , puede establecer su objective (o mínimo) sdk a 4 (API 1.6) y agregar el paquete de compatibilidad de Android (v4) para agregar soporte para Fragments . Ayer hice esto e implementé Fragments con éxito para visualizar datos de una clase personalizada.

Mi pregunta es esta: ¿cuál es el beneficio de usar Fragments en lugar de simplemente obtener una Vista desde un objeto personalizado, y aún así soportar API 1.5?

Por ejemplo, digamos que tengo la clase Foo.java:

 public class Foo extends Fragment { /** Title of the Foo object*/ private String title; /** A description of Foo */ private String message; /** Create a new Foo * @param title * @param message */ public Foo(String title, String message) { this.title = title; this.message = message; }//Foo /** Retrieves the View to display (supports API 1.5. To use, * remove 'extends Fragment' from the class statement, along with * the method {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}) * @param context Used for retrieving the inflater */ public View getView(Context context) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View v = inflater.inflate(R.layout.foo, null); TextView t = (TextView) v.findViewById(R.id.title); t.setText(this.title); TextView m = (TextView) v.findViewById(R.id.message); m.setText(this.message); return v; }//getView @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (container == null) { return null; } View v = inflater.inflate(R.layout.foo, null); TextView t = (TextView) v.findViewById(R.id.title); t.setText(this.title); TextView m = (TextView) v.findViewById(R.id.message); m.setText(this.message); return v; }//onCreateView }//Foo 

Ambos métodos son muy simples de crear y trabajar en una actividad que, por ejemplo, tiene una List para mostrar (por ejemplo, agregando programáticamente cada uno a una vista de ScrollView ), así que los Fragments son realmente útiles, o solo son una simplificación demasiado glorificada para obtener una Vista, como a través del código anterior?

    La razón principal para usar Fragmentos es para las características backstack y ciclo de vida. De lo contrario, las vistas personalizadas son más livianas y más sencillas de implementar.

    Al principio, intenté construir una aplicación para teléfono / tableta usando vistas personalizadas. Todo parecía funcionar en teléfonos Y tabletas, incluso cambiando de panel único a panel dividido. Donde tuve problemas fue con el botón Atrás y el ciclo de vida. Como simplemente estaba actualizando vistas manualmente … no había nada que hiciera un seguimiento del historial de vistas y sus estados. Por lo tanto, el botón Atrás no funcionó como se esperaba y fue difícil recrear incluso el estado más reciente durante los eventos del ciclo de vida, como al rotar la aplicación. Para solucionarlo, tuve que ajustar mis vistas personalizadas en fragmentos y usar FragmentManager para que los estados anteriores se guardaran y volvieran a crear.

    Me di cuenta después de contestar que publiqué una pregunta similar el año anterior: https://stackoverflow.com/a/11126397/618881

    Diría que los fragmentos son útiles en dos escenarios: si divide vistas en algunos dispositivos / orientaciones y los muestra en dos actividades y muestra todo el contenido en uno en otros dispositivos. Eso sería un caso de uso si vas en una tableta o incluso en el modo horizontal en un teléfono: por ejemplo, muestra la lista de elementos y los detalles en una pantalla. en un teléfono o en modo retrato, solo muestra una parte.

    Otro caso de uso son las vistas reutilizables. Entonces, si tiene algunas vistas que son visibles en diferentes actividades y también realiza algunas acciones, puede poner este comportamiento en un fragmento y luego reutilizarlo. Obviamente, probablemente puedas hacer eso también con widgets personalizados.

    No veo ninguna razón para usar Fragmentos para cada Vista y supongo que solo será una sobrecarga. Solo los estoy usando en el primer caso de uso y diría que es una simplificación.

    Android introdujo fragmentos en Android 3.0 (API nivel 11), principalmente para admitir diseños de IU más dynamics y flexibles en pantallas grandes, como tabletas. Debido a que la pantalla de una tableta es mucho más grande que la de un teléfono, hay más espacio para combinar e intercambiar componentes de la interfaz de usuario. Los fragmentos permiten tales diseños sin la necesidad de administrar cambios complejos en la jerarquía de vistas. Al dividir el diseño de una actividad en fragmentos, puede modificar la apariencia de la actividad en tiempo de ejecución y preservar esos cambios en una stack posterior administrada por la actividad.

    Aquí puedes leer más.

    1. Pantalla de división de actividad de escenario: tenemos un diseño y una actividad que manejan la parte izquierda de la pantalla
    2. Escenario FragmentActivity tenemos un diseño para la pantalla principal, uno para la izquierda para la derecha

    El escenario uno es bueno si tiene una aplicación simple.

    El escenario dos es bueno si desea tener múltiples fragmentos y varias actividades de fragmentación, y puede combinar cada uno de ellos. También puedes hacer interacción entre fragmentos.

    He dividido la pantalla Fragmentactivity, puedo llamarlo con ‘Intent Extras’ y decirle a fragmentActivity qué fragmento debe cargarse. Los fragmentos son buenos porque no están en manifiesto, por lo que puedes hacer fragmentos reutilizables y FragmentActvity.

    Pero hace que tu proyecto sea más grande. Pero si haces un gran proyecto, puedes ahorrar muchos. Porque puedes usar los mismos Fragmentos o la misma actividad de Fragmento.

    Y creo que estos fragmentos llegan un poco tarde, así que debes tratar de pensar de una manera nueva. Tal vez intente convertir su actividad a FragmentActivity. Más tarde intente encontrar código reutilizable y haga Fragment de él.

    Es útil, pero no sé cómo en este momento. Pero tengo algunas ideas.

    Esto siempre es un problema El equipo de Android hizo algo y nadie sabe para qué sirve. Porque apenas aprendemos como era y aquí vienen algunas cosas nuevas.

    En mi opinión, es bueno, pero no por una razón, que Google nos lo diga.

    Agregue un caso cuando use Fragment o Activity en CustomView:

    Cuando usa CursorLoader para observar ciertas vistas, ListView o TextView y desea actualizar su valor de visualización siempre que las actualizaciones de datos de su proveedor de contenido en la parte posterior (caso más común tiene un servicio que actualiza su base de datos local sondeando datos de base de datos remota / nube periódicamente )

    Una gran cosa que todos los comentarios anteriores no mencionan es que un fragmento permanece residente en la memoria incluso si Android mata la actividad y la reinicia cuando hace algo como cambiar la orientación de su dispositivo. Esto se hace por razones de rendimiento, pero también puede generar resultados inesperados si esperaba que los fragmentos se destruyan solo para descubrir que están siendo recreados de la nada.