60 votes

Comment donner les données initiales aux fragments ?

J'ai donc appris que j'ai besoin d'un constructeur vide pour que mes fragments ne se plantent pas lors de la réinitialisation. Mon problème est que j'utilise des listes de données pour mes fragments lorsqu'ils sont initialisés (au moins certains d'entre eux). Donc, quelle serait une bonne façon de démarrer de nouveaux fragments avec une liste de données. Devrais-je dans le OnCreate() faire un getData qui obtient les données d'une autre source ou quelle serait l'approche appropriée ?

Nourrir le faisceau de données ne serait pas vraiment une bonne approche, car j'ai beaucoup de données.

Prenons donc un cas (je le comprends beaucoup mieux de cette façon).

Lorsqu'un utilisateur clique sur un bouton, le fragment est lancé. Ce que j'avais l'habitude de faire était de créer un nouveau fragment de cette façon :

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.replace(R.id.center_container, new DetailFragment(item));
    fragmentTransaction.addToBackStack(DETAIL_TAG);

    fragmentTransaction.commit();

Puis dans mon fragment :

public DetailFragment(EventItem item) {
    mItem = item;
    mPlaces = Database.getContainerPlaces(getActivity()).getValidItems();
}

Je ne peux pas donner toutes les données à une liasse, donc ça ne marcherait pas. Alors, que dois-je faire ?

R : Dois-je initialiser le fragment avec le constructeur vide et ensuite, à partir de mon activité, utiliser les setters pour définir les données directement dans le fragment ? Cependant, ne vais-je pas manquer des données si l'utilisateur appuie sur home, Android ferme le fragment et l'utilisateur revient plus tard ?

B : Devrais-je initialiser le fragment avec le motif de la fabrique et appeler setRetainInstance(true) Le fragment doit-il donner au fragment une clé pour identifier les données, puis laisser le fragment récupérer les données nécessaires dans onCreateView à partir d'une source tierce ?

C : Devrais-je simplement faire un constructeur vide et ensuite dans onCreate() récupérer les données nécessaires pour le fragment ?

Il convient de noter que l'application est verrouillée en mode portrait et que le problème réside principalement dans le maintien des objets lorsque Android se ferme et que l'utilisateur redémarre.

73voto

CommonsWare Points 402670

Alors, quelle serait une bonne façon de commencer de nouveaux fragments avec une liste de données.

Utiliser le modèle d'usine et les "arguments" Bundle comme :

package com.commonsware.empublite;

import android.os.Bundle;

public class SimpleContentFragment extends AbstractContentFragment {
  private static final String KEY_FILE="file";

  protected static SimpleContentFragment newInstance(String file) {
    SimpleContentFragment f=new SimpleContentFragment();

    Bundle args=new Bundle();

    args.putString(KEY_FILE, file);
    f.setArguments(args);

    return(f);
  }

  @Override
  String getPage() {
    return(getArguments().getString(KEY_FILE));
  }
}

Si vous conservez votre instance de fragment, vous devriez pouvoir vous en sortir en utilisant simplement des setters ordinaires pour mettre des choses dans les membres de données. Les "arguments" Bundle est conservé dans le cadre des changements de configuration, donc pour les instances non conservées, c'est le moyen de garantir que vos données de configuration sont conservées si l'utilisateur fait pivoter l'écran, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X