Fragmento o Fragmento de soporte?

125

Estoy desarrollando una aplicación compatible con Android> = 4.0. Utiliza fragmentos del android.apppaquete. Como me enfrento a problemas con la implementación de fragmentos más antigua en 4.0, como esta , que ya están arreglados en la biblioteca de soporte, estoy considerando volver a la implementación de fragmentos desde la biblioteca de soporte para obtener una implementación más confiable y consistente.

¿Qué opinas de esto? ¿Está utilizando fragmentos de la biblioteca de soporte, aunque ya están disponibles, al desarrollar para Android 4?

Brillenheini
fuente
2
Esta es una buena pregunta (+1 porque me da curiosidad). Tampoco hay una buena explicación en la web para esto. Estoy usando la biblioteca de soporte para mi aplicación y me pregunto si estoy equivocado o no, porque no noté ningún error durante la compilación o durante la prueba.
JJ86
2
@animuson La respuesta de brillenheini demuestra que esta no es una respuesta basada principalmente en la opinión.
OneWorld

Respuestas:

90

Desde mi experiencia, usar la misma implementación de fragmentos en todos los dispositivos Android es una gran ventaja. No pude deshacerme de todas las NullPointerExceptions cuando el estado se guarda en Android 4.0 usando fragmentos nativos, con la biblioteca de soporte todos se han ido. Además, no podía ver ninguna desventaja hasta ahora con este enfoque.

Entonces, mi respuesta a mi propia pregunta es ahora: cuando desarrolle para Android 4.x, usar los fragmentos de la biblioteca de soporte es una buena idea. La biblioteca de soporte tiene errores corregidos que todavía están presentes en implementaciones de fragmentos más antiguos y se actualiza con frecuencia con más correcciones de errores.

Brillenheini
fuente
11
Entonces, ¿cuál es el propósito del android.app.Fragmententonces? Si puede agregar esto a su respuesta aquí con un poco más de explicación, estaría completamente satisfecho. ¡Gracias!
jonstaff
1
@jonstaff La razón es probablemente histórica. Por favor, vea mi respuesta actualizada allí.
brillenheini
11
En aras de la integridad, parece que hay cosas que los fragmentos de soporte no pueden hacer (por ejemplo, estar animadosobjectAnimator , incluso si el sistema operativo de destino real lo admite). Lo que, en caso de que esté usando ViewPager, significa que debe usar adaptadores de la biblioteca de soporte v13, de lo contrario no puede tener tanto el visor como la animación de volteo.
GSerg
55
También tenga cuidado, a partir de agosto de 2014, la biblioteca v13 no puede hacer fragmentos anidados.
Martin Marconcini
1
¿Por qué los chicos de Google optaron por usar la biblioteca v13 para la aplicación iosched? Github.com/google/iosched/blob/master/android/src/main/java/com/… , deben tener alguna razón
forcewill
40

Una gran razón para seguir con esto SupportFragmentpor un tiempo es que no tiene acceso a la ChildFragmentManagerAPI hasta la 17. La biblioteca de soporte le dará una versión de soporte del administrador de fragmentos secundarios.

Esto se convierte en un gran problema si tiene fragmentos que contienen otros fragmentos. Esto es común en aplicaciones de tabletas con una gran complejidad y / o su arquitectura general se basa en un diseño con pestañas o utiliza el cajón de navegación.

Ross Hambrick
fuente
21

También me frustraba tener que incluir las bibliotecas de soporte, a pesar de apuntar a Android 4.0+, pero parece que se recomienda oficialmente:

El paquete de la Biblioteca de soporte de Android contiene varias bibliotecas que se pueden incluir en su aplicación. Cada una de estas bibliotecas admite una gama específica de versiones de la plataforma Android y un conjunto de características.

Esta guía explica las características importantes y el soporte de versiones proporcionadas por las Bibliotecas de soporte para ayudarlo a decidir cuál de ellas debe incluir en su aplicación. En general, recomendamos incluir el soporte v4 y las bibliotecas v7 appcompat, porque admiten una amplia gama de versiones de Android y proporcionan API para los patrones de interfaz de usuario recomendados.

http://developer.android.com/tools/support-library/features.html

sourabhj
fuente
Esta debería ser la respuesta aceptada, a pesar de que @brillenheini proporcionó una respuesta por sí mismo. Responde a la pregunta con la mayor precisión y concisión.
Arvindh Mani
4

En mi humilde opinión, si planea desarrollar solo para 4.0, recomendaría ir con las bibliotecas nativas ya que el ejecutable se hará más pequeño. Es cierto que podría tener problemas de errores en las primeras versiones, pero creo que la mayoría de estos deberían ser bastante triviales. Además, se supone que la biblioteca de compatibilidad se debe asignar a los fragmentos nativos en caso de que esté ejecutando en 4.0 y versiones superiores de todos modos. Por lo tanto, puede terminar teniendo que luchar con este tipo de problemas de todos modos. El problema con las bibliotecas de soporte es que muchas de las clases aparecen 2 veces (una vez en la estructura del paquete de soporte y otra en la estructura del paquete "nativo"), lo que hace que el desarrollo sea un poco más engorroso.

Sin embargo, si desea lanzar también su aplicación pre 4.0, entonces no hay forma de evitar la biblioteca de soporte. Además, dado que hay aproximadamente el 38% de todos los usuarios en 2.3, podría tener sentido comercial incluir esta versión del sistema operativo. En tal caso, puede usar la biblioteca de soporte en combinación con Jake Wartons ActionBarSherlock (o con los googles compatibles con ActionBar Library una vez que finalmente se lance).

RaB
fuente
3
Gracias por tu respuesta. Como necesito ViewPager, tengo que incluir la biblioteca de soporte de todos modos. Además, el fragmento de soporte no intenta cambiar a la implementación nativa si está disponible. Eso es lo que dicen los documentos .
brillenheini
Sí, la cuestión es (como dijo @brillenheini) que para tener el ViewPager necesitas v4, por lo que incluso si estás apuntando solo a dispositivos v13 +, es probable que termines de tener el v4 de todos modos.
Sotti
También descubrí eso (ViewPager necesita v4) en mi API 21 y en la aplicación. Meh: - /
mraviator