Quel est l'avantage d'utiliser des Fragments dans Android, plutôt que des vues?

lors du développement pour Android , vous pouvez définir votre sdk cible (ou minimum) à 4 (API 1.6) et ajouter le paquet de compatibilité android (v4) pour ajouter le support pour Fragments . Hier j'ai fait ceci et j'ai implémenté avec succès Fragments pour visualiser les données d'une classe personnalisée.

ma question Est la suivante: Quel est l'avantage d'utiliser Fragments au lieu de simplement obtenir une vue à partir d'un objet personnalisé, tout en supportant L'API 1.5?

Par exemple, disons que j'ai la classe 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

les deux méthodes sont très simples à créer et à travailler dans une activité qui, disons, a un List<Foo> à afficher (par exemple, en ajoutant programmatiquement chacun à un ScrollView ), sont donc Fragments vraiment tout ce que utile, ou sont-ils juste une simplification trop glorifiée d'obtenir une vue, comme à travers le code ci-dessus?

99
demandé sur ZhiXingZhe - WangYuQi 2011-12-23 19:25:57

6 réponses

la principale raison d'utiliser les Fragments est pour les caractéristiques backsack et lifecycle. Autrement, les vues personnalisées sont plus légères et plus simples à mettre en œuvre.

au début, j'ai essayé de construire un téléphone/tablette app en utilisant des vues personnalisées. Tout semblait à travailler à travers les téléphones et les tablettes, même en passant d'un panneau simple à panneau fractionné. J'ai eu des problèmes avec le bouton arrière et le cycle de vie. Depuis Je ne faisais que mettre à jour les vues manuellement...rien ne permettait de suivre l'histoire des opinions et de leurs états. Par conséquent, le bouton arrière n'a pas fonctionné comme prévu et il était difficile de recréer même l'état le plus récent pendant les événements du cycle de vie, comme lors de la rotation de l'application. Pour corriger cela, j'ai dû envelopper mes vues personnalisées dans des fragments et utiliser le FragmentManager pour que les états précédents soient sauvés et recréés.

j'ai réalisé après avoir répondu que je posté à une question similaire un an plus tôt: https://stackoverflow.com/a/11126397/618881

163
répondu Henry 2017-05-23 12:18:25

je dirais que les Fragments sont utiles dans deux scénarios: si vous divisez les vues sur certains dispositifs/orientations et les montrer dans deux activités et montrer tout le contenu dans un sur d'autres dispositifs. Ce serait un cas d'utilisation si vous allez sur une tablette ou peut-être même en mode paysage sur un téléphone: par exemple, vous montrez la liste des articles et les détails sur un écran. sur un téléphone ou en mode portrait, vous ne montrez qu'une partie.

un autre cas d'utilisation sont des vues réutilisables. Donc si vous avez des points de vue qui sont visibles sur différentes activités et aussi effectuer certaines actions que vous pourriez mettre ce comportement dans un fragment et ensuite le réutiliser. Évidemment, vous pouvez probablement le faire avec des widgets personnalisés aussi.

Je ne vois aucune raison d'utiliser des Fragments pour chaque vue et je suppose que ce serait juste un overhead. Je ne les utilise que dans le premier cas d'utilisation et je dirais ici que c'est une simplification.

27
répondu Maria Neumayer 2011-12-23 15:52:58

Android introduit des fragments dans Android 3.0 (niveau API 11), principalement pour prendre en charge des conceptions D'interface utilisateur plus dynamiques et flexibles sur les grands écrans, tels que les tablettes. Comme l'écran d'une tablette est beaucoup plus grand que celui d'un combiné, il y a plus de place pour combiner et échanger des composantes D'interface utilisateur. Les Fragments permettent de telles conceptions sans que vous ayez besoin de gérer des changements complexes à la hiérarchie des vues. En divisant la disposition d'une activité en fragments, vous devenez capable de modifier l'apparence de l'activité à l'exécution et de préserver ces changements dans une pile arrière qui est gérée par l'activité.

Ici vous pouvez en lire plus.

3
répondu Yury 2011-12-23 15:55:18
  1. Scénario de l'Activité en écran partagé - Nous avoir Une Mise en page, et une poignée de gauche à droite de l'écran la partie
  2. Scénario FragmentActivity nous avons Une mise en page pour l'écran Principal, celui de gauche pour le droit

scénario un est bon si vous avez une application simple.

scénario deux est bon si vous voulez avoir plusieurs Fragments et multiples Fragmentactivités et vous pouvez combiner chacun de ceux-ci. Également vous pouvez faire l'interaction entre les fragments.

j'ai Fractionnéactivité de fragment d'écran je peux l'appeler avec "Extras D'intention" et dire à fragmentActivity quel fragment doit être chargé. Les Fragments sont bons parce qu'ils ne sont pas en évidence de sorte que vous pourriez faire des fragments réutilisables et Fragmentactity.

mais cela rend votre projet plus grand. Mais si vous faites grand projet, vous pouvez en sauver beaucoup. Parce que vous pouvez utiliser les mêmes Fragments ou la même activité de Fragment.

et je pense que ces fragments viennent un peu tard donc vous devez essayer de penser d'une nouvelle façon. Peut-être juste essayer de convertir votre activité en Fragmentactivité. Plus tard, essayez de trouver du code réutilisable et D'en faire des fragments.

C'est utile mais je ne sais pas comment en ce moment. Mais j'ai quelques idées.

C'est toujours un problème. L'équipe androïde a créé quelque chose et personne ne sait à quoi ça sert. Parce que nous apprenons à peine comme il était et voilà quelques nouvelles choses.

à mon avis, il est bon, mais pas pour la raison que google nous dire.

3
répondu Mertuarez 2013-01-18 15:38:01

Ajouter un cas lorsque vous utilisez Fragment ou Activity over CustomView:

lorsque vous utilisez CursorLoader pour observer certaines vues, ListView ou TextView et que vous voulez mettre à jour leur valeur d'affichage à chaque fois que vos mises à jour de données ContentProvider à la fin(cas le plus commun vous avez un service qui met à jour votre base de données locale en sondant les données de la base de données distante/cloud périodiquement)

0
répondu macio.Jun 2013-11-05 01:41:49

une grande chose tous les commentaires ci-dessus ne mentionnent pas est qu'un fragment demeure dans la mémoire même si Android tue l'activité et redémarre lorsque vous faites quelque chose comme changer l'orientation de votre appareil. Cela est fait pour des raisons de performance, mais peut également conduire à des résultats inattendus si vous attendiez fragments d'être détruits que pour constater qu'ils sont en train de se recréer de nulle part.

-2
répondu AndroidDev 2015-07-24 19:54:46