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

102

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

Mi pregunta es la siguiente: ¿cuál es el beneficio de usar Fragmentsen lugar de simplemente obtener una Vista de un objeto personalizado y aún admitir 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 un List<Foo>para mostrar (por ejemplo, agregar programáticamente cada uno a ScrollView), por lo que son Fragmentsrealmente muy útiles, o son solo una simplificación exagerada de obtener una vista, como a través del código anterior?

Phil
fuente
2
Los fragmentos no tienen que tener una interfaz de usuario, solo pueden ser un comportamiento reutilizable. En ese caso, una Vista sería redundante.
Philipp Reichart
Respondí esto en otra pregunta. Consulte stackoverflow.com/a/14912608/909956 T; dr: a veces, los fragmentos le permiten crear más componentes reutilizables que confiar en la implementación de la vista personalizada. vea el enlace para saber por qué.
Numan Salati

Respuestas:

172

La razón principal para usar Fragments son las funciones de backstack y ciclo de vida. De lo contrario, las vistas personalizadas son más ligeras y más sencillas de implementar.

Al principio, intenté crear 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 me metí en problemas fue con el botón de retroceso y el ciclo de vida. Dado que simplemente estaba actualizando las vistas manualmente ... no había nada que rastreara el historial de vistas y sus estados. Por lo tanto, el botón de retroceso no funcionó como se esperaba y fue difícil recrear incluso el último estado durante los eventos del ciclo de vida, como al rotar la aplicación. Para solucionarlo, tuve que envolver mis vistas personalizadas en fragmentos y usar FragmentManager para que los estados anteriores se guardaran y se recrearan.

Me di cuenta después de responder que publiqué una pregunta similar un año antes: https://stackoverflow.com/a/11126397/618881

Enrique
fuente
14
Muy buena respuesta. Solo quería agregar que los fragmentos se pueden anidar desde 4.2 o la biblioteca de soporte rev 11.
kar
2
Gracias @Karlo por la actualización. No pensé que fuera posible conceptualmente, pero lo solucionaron utilizando un FragmentManager privado a través de getChildFragmentManager (). Ah, y es API 17, no 11, y está disponible a través de la biblioteca de soporte.
Henry
2
Estaba volviendo a analizar esta pregunta y mi experiencia también ha cambiado. Esta es una respuesta que proporciona una buena comprensión de los beneficios y los inconvenientes, y es muy útil. ¡Gracias!
Phil
2
Quiere hacer +1 en esta respuesta, pero hacerlo arruinaría la puntuación actual. Además, el 70 no es mi número favorito.
Behnam
1
durante el año pasado, también estaba pensando que los Fragmentos no proporcionan ninguna característica extra ordinaria, pero experimenté que después de hacer clic en la actividad estaba perdiendo todas las imágenes descargadas en eso, así que tuve que agregar una implementación de caché, ahora estoy pensando en usar fragmentos puede ser muy fácil
Shirish Herwade
27

Yo diría que los fragmentos son útiles en dos escenarios: si divide las vistas en algunos dispositivos / orientaciones y las muestra en dos actividades y muestra todo el contenido en una en otros dispositivos. Ese sería un caso de uso si usa una tableta o tal vez incluso en 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 también podrías hacer eso con widgets personalizados.

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

María Neumayer
fuente
Gracias, esto fue definitivamente útil. Creo que me quedaré con las vistas y haré mi propia 'pila de copias' para que sean reutilizables.
Phil
3

Android introdujo fragmentos en Android 3.0 (API nivel 11), principalmente para admitir diseños de IU más dinámicos 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 este tipo de 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 conservar esos cambios en una pila de actividades administrada por la actividad.

Aquí puedes leer más.

Yury
fuente
He leído toda la documentación, sin embargo, estaba buscando algo que explique mejor sus beneficios, como para tabletas o backstack
Phil
3
  1. Pantalla dividida de actividad de escenario: tenemos un diseño y una actividad que manejan la parte de la pantalla izquierda derecha
  2. Escenario FragmentActivity tenemos un diseño para la pantalla principal, uno para la izquierda y uno 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 múltiples FragmentActivities y puede combinar cada uno de ellos. También puedes hacer interacción entre fragmentos.

Tengo Fragmentactivity de pantalla dividida, puedo llamarlo con 'Intent Extras' y decirle a fragmentActivity qué fragmento se va a cargar. Los fragmentos son buenos porque no están en manifiesto, por lo que podría hacer fragmentos reutilizables y FragmentActvity.

Pero hace que su proyecto sea más grande. Pero si haces un gran proyecto puedes salvar muchos. Porque puede usar los mismos Fragmentos o la misma actividad de Fragmentos.

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

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

Esto siempre es un problema. Android Team 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 la razón que Google nos diga.

Mertuarez
fuente
0

Agregue un caso cuando use Fragmento o Actividad sobre CustomView:

Cuando usa CursorLoader para observar ciertas vistas, ListView o TextView y desea actualizar su valor de visualización cada vez que los datos de su ContentProvider se actualizan en el back-end (el caso más común es que tenga un servicio que actualice su base de datos local sondeando datos de la base de datos remota / nube periódicamente )

macio.Jun
fuente
-2

Una cosa importante que no mencionan todos los comentarios anteriores es que un fragmento permanece residente en la memoria incluso si Android elimina la actividad y la reinicia cuando haces algo como cambiar la orientación de tu dispositivo. Esto se hace por motivos de rendimiento, pero también puede dar lugar a resultados inesperados si esperaba que se destruyeran fragmentos solo para descubrir que se están recreando de la nada.

AndroidDev
fuente