Fragment ou fragment de support?

125

Je développe une application prenant en charge Android> = 4.0. Il utilise des fragments du android.apppackage. Comme je suis confronté à des problèmes avec l'ancienne implémentation de fragment dans la version 4.0, comme celle-ci , qui est déjà corrigée dans la bibliothèque de support, j'envisage de revenir à l'implémentation de fragment de la bibliothèque de support pour obtenir une implémentation plus fiable et cohérente.

Quelle est ton opinion à ce propos? Utilisez-vous des fragments de la bibliothèque de support, même s'ils sont déjà disponibles, lors du développement pour Android 4?

brillenheini
la source
2
C'est une belle question (+1 car cela me rend curieux). Il n'y a pas non plus de bonne explication sur le Web pour cela. J'utilise la bibliothèque de support pour mon application et je me demande si je me trompe ou non, car je n'ai remarqué aucune erreur lors de la compilation ou du test.
JJ86
2
@animuson La réponse de brillenheini prouve qu'il ne s'agit pas d'une réponse essentiellement basée sur l'opinion.
OneWorld

Réponses:

90

D'après mon expérience, utiliser la même implémentation de fragment sur tous les appareils Android est un grand avantage. Je ne pouvais pas me débarrasser de toutes les NullPointerExceptions lorsque l'état est enregistré sur Android 4.0 à l'aide de fragments natifs, avec la bibliothèque de support, ils ont tous disparu. De plus, je ne voyais aucun inconvénient à ce jour avec cette approche.

Ma réponse à ma propre question est donc la suivante: lors du développement pour Android 4.x, l'utilisation des fragments de la bibliothèque de support est une bonne idée. La bibliothèque de support a des bogues corrigés qui sont toujours présents dans les implémentations de fragments plus anciennes et est fréquemment mis à jour avec plus de corrections de bogues.

brillenheini
la source
11
Alors, quel est le but du android.app.Fragmentalors? Si vous pouvez ajouter ceci à votre réponse ici avec un peu plus d'explications, je serais pleinement satisfait. Merci!
jonstaff
1
@jonstaff La raison est probablement historique. S'il vous plaît voir ma réponse mise à jour ici.
brillenheini
11
Par souci d'exhaustivité, il semble y avoir des choses que les fragments de support ne peuvent pas faire (par exemple, être animé avecobjectAnimator , même si le système d'exploitation cible le prend en charge). Ce qui, dans le cas où vous utilisez ViewPager, signifie que vous devez utiliser des adaptateurs de la bibliothèque de support v13, sinon vous ne pouvez pas avoir à la fois le visualiseur et l'animation de retournement.
GSerg
5
Faites également attention, depuis août 2014, la bibliothèque v13 ne peut pas faire de fragments imbriqués.
Martin Marconcini
1
Pourquoi les gars de Google ont-ils choisi d'utiliser la bibliothèque v13 pour l'application iosched github.com/google/iosched/blob/master/android/src/main/java/com/… , ils doivent avoir une raison
forcewill
40

Une des principales raisons de s'en tenir à l ' SupportFragmentpendant un certain temps est que vous n'avez pas accès à l' ChildFragmentManagerAPI jusqu'à 17. La bibliothèque de support vous donnera une version de support du gestionnaire de fragments enfants.

Cela devient un gros problème si vous avez des fragments qui contiennent d'autres fragments. Ceci est courant dans les applications de tablette avec beaucoup de complexité et / ou votre architecture globale est basée sur une mise en page à onglets ou utilise le tiroir de navigation.

Ross Hambrick
la source
21

J'étais également frustré de devoir inclure les bibliothèques de support, malgré le ciblage d'Android 4.0+ - mais il semble que cela soit officiellement recommandé:

Le package Bibliothèque de support Android contient plusieurs bibliothèques qui peuvent être incluses dans votre application. Chacune de ces bibliothèques prend en charge une gamme spécifique de versions de plate-forme Android et un ensemble de fonctionnalités.

Ce guide explique les fonctionnalités importantes et la prise en charge des versions fournies par les bibliothèques de support pour vous aider à choisir celles que vous devez inclure dans votre application. En général, nous vous recommandons d'inclure la prise en charge v4 et les bibliothèques appcompat v7, car elles prennent en charge un large éventail de versions Android et fournissent des API pour les modèles d'interface utilisateur recommandés.

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

sourabhj
la source
Cela devrait être la réponse acceptée, malgré le fait que @brillenheini a lui-même fourni une réponse. Il répond à la question avec la meilleure exactitude et concision.
Arvindh Mani
4

IMHO si vous prévoyez de développer pour 4.0 uniquement, je recommanderais d'aller avec les bibliothèques natives car l'exécutable deviendra plus petit. Il est vrai que vous pourriez rencontrer des problèmes de bogues dans les premières versions, mais je pense que la plupart de ceux-ci devraient être assez simples à contourner. De plus, la bibliothèque de compatibilité est censée mapper sur les fragments natifs au cas où vous seriez de toute façon sous 4.0 et supérieur. De toute façon, vous risquez donc de devoir vous débattre avec ce genre de problèmes. Le problème avec les bibliothèques de support est que beaucoup de classes apparaissent 2x (une fois dans la structure du package de support et une fois dans la structure de package "native"), ce qui rend le développement un peu plus compliqué.

Cependant, si vous souhaitez également publier votre application avant la version 4.0, il n'y a aucun moyen de contourner la bibliothèque de support. De plus, étant donné qu'il y a environ 38% de tous les utilisateurs sur 2.3, il peut être judicieux d'inclure cette version du système d'exploitation. Dans un tel cas, vous pouvez utiliser la bibliothèque de support en combinaison avec Jake Wartons ActionBarSherlock (ou avec le support de googles ActionBar Library une fois qu'il est finalement publié).

RaB
la source
3
Merci pour votre réponse. Parce que j'ai besoin de ViewPager, je dois quand même inclure la bibliothèque de support. En outre, le fragment de prise en charge n'essaye pas de basculer vers l'implémentation native si disponible. C'est ce que disent les documents .
brillenheini
Oui, le fait est (comme @brillenheini l'a dit) que pour avoir le ViewPager, vous avez besoin de la v4, donc même si vous ne ciblez que les appareils v13 +, vous finirez probablement d'avoir la v4 de toute façon.
Sotti
Je viens de découvrir cela aussi (ViewPager a besoin de la v4) sur mon API 21 et sur l'application. Meh: - /
mraviator
2

Il semble qu'il soit préférable d'utiliser la bibliothèque de support maintenant car j'ai vu la déclaration ici https://developer.android.com/reference/android/app/Fragment.html

Cette classe était obsolète au niveau de l'API P. Utilisez le fragment de bibliothèque de support pour un comportement cohérent sur tous les appareils et un accès à Lifecycle.

code4j
la source