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?
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
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.
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.
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.
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. )