web-dev-qa-db-fra.com

Quel est l'avantage d'utiliser Fragments dans Android plutôt que dans Vues?

Lors du développement pour Android, vous pouvez définir votre sdk cible (ou minimum) sur 4 (API 1.6) et ajouter le package de compatibilité Android (v4)) pour ajouter le support de Fragments. Hier, j’ai fait cela et mis en œuvre avec succès Fragments pour visualiser les données d’une classe personnalisée.

Ma question est la suivante: quel est l'avantage de l'utilisation de Fragments par rapport à l'obtention d'une vue à partir d'un objet personnalisé, tout en prenant en charge 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 à utiliser dans une activité qui, par exemple, a un List<Foo> à afficher (par exemple, en ajoutant par programme chacun à un ScrollView), ainsi Fragments est-il vraiment utile, ou s'agit-il simplement d'une simplification trop glorifiée d'obtenir une vue, telle que à travers le code ci-dessus?

102
Phil

La principale raison d'utiliser Fragments concerne les fonctionnalités de pile et de cycle de vie. Sinon, les vues personnalisées sont plus légères et plus simples à implémenter .

Au début, j'ai en fait essayé de créer une application pour téléphone/tablette à l'aide de vues personnalisées. Tout est apparu pour fonctionner sur les téléphones ET les tablettes, même en passant d'un panneau à un autre. J'ai eu des problèmes avec le bouton arrière et le cycle de vie. Comme je mettais simplement à jour les vues manuellement ... rien ne permettait de suivre l'historique des vues et leurs états. Par conséquent, le bouton Précédent ne fonctionnait pas comme prévu et il était difficile de recréer le dernier état lors d'événements de cycle de vie, par exemple lors de la rotation de l'application. Pour résoudre ce problème, je devais emballer mes vues personnalisées en fragments et utiliser FragmentManager afin que les états précédents soient sauvegardés et recréés.

Après avoir répondu, j'ai réalisé que j'avais posté à une question similaire l'année précédente:https://stackoverflow.com/a/11126397/618881

166
Henry

Je dirais que les fragments sont utiles dans deux scénarios: si vous séparez des vues sur certains appareils/orientations et les affichez dans deux activités et affichez tout le contenu dans une sur d'autres appareils. 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 affichez la liste des articles et les détails sur un seul écran. sur un téléphone ou en mode portrait, vous n’en affichez qu’une partie.

Un autre cas d'utilisation sont les vues réutilisables. Par conséquent, si vous avez des vues visibles sur différentes activités et effectuez également certaines actions, vous pouvez mettre ce comportement dans un fragment, puis le réutiliser. Évidemment, vous pourriez probablement le faire aussi avec des widgets personnalisés.

Je ne vois aucune raison d'utiliser Fragments pour chaque vue et j'imagine que ce ne serait que des frais généraux. Je ne les utilise que dans le premier cas d'utilisation et je dirais ici qu'il s'agit d'une simplification.

27
Maria Neumayer

Android a introduit des fragments dans Android 3.0 (API de niveau 11), principalement pour prendre en charge des conceptions d'interface utilisateur plus dynamiques et flexibles sur les grands écrans, tels que les tablettes. Parce que l'écran d'une tablette est beaucoup plus grand que celui d'un combiné Les fragments permettent de créer des conceptions complexes sans qu'il soit nécessaire de gérer des modifications complexes de la hiérarchie des vues. En divisant la présentation d'une activité en fragments, vous pouvez modifier l'apparence de l'activité à l'exécution et conservez ces modifications dans une pile arrière gérée par l'activité.

Ici vous pouvez en lire plus.

3
Yury
  1. Scénario Activité Écran divisé - Nous avons une mise en page et une activité qui gèrent la partie écran gauche-droite
  2. Scénario FragmentActivité nous avons une disposition pour l’écran principal, une pour la gauche une autre pour la droite

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

Le scénario deux est utile si vous souhaitez avoir plusieurs fragments et plusieurs activités fragmentées et que vous pouvez combiner chacun de ceux-ci. Aussi, vous pouvez créer une interaction entre les fragments.

J'ai fractionné l'activité fragmentée de l'écran, je peux l'appeler avec 'Extrent Intent' et indiquer à fragmentActivity quel fragment doit être chargé. Les fragments sont bons parce qu'ils ne sont pas dans le manifeste, vous pouvez donc créer des fragments réutilisables et FragmentActvity.

Mais cela agrandit votre projet. Mais si vous faites de gros projets, vous pouvez en économiser beaucoup. Parce que vous pouvez utiliser les mêmes fragments ou la même activité de fragments.

Et je pense que ces fragments arrivent un peu tard, vous devez donc essayer de penser différemment. Essayez peut-être simplement de convertir votre activité en FragmentActivity. Plus tard, essayez de trouver du code réutilisable et d’en faire un fragment.

Son utile mais je ne sais pas comment pour le moment. Mais j'ai des idées.

C'est toujours un problème. Android L’équipe a fait quelque chose et personne ne sait à quoi il sert. Parce que nous n’apprenons plus ce qu’il était et nous avons appris de nouvelles choses.

A mon avis c'est bien mais pas pour la raison que Google nous dit.

3
Mertuarez

Ajoutez un cas lorsque vous utilisez Fragment ou Activity sur CustomView:

Lorsque vous utilisez CursorLoader pour observer certaines vues, ListView ou TextView, vous souhaitez mettre à jour leur valeur d'affichage chaque fois que les données de votre fournisseur de contenu se mettent à jour en arrière-plan (dans le cas le plus courant, vous avez un service qui met à jour votre base de données locale en interrogeant périodiquement les données depuis une base de données/cloud distante. )

0
macio.Jun