Question

Ceci est une question de conception, plutôt que d'ordre technique.

Cas général :. Je veux un événement d'interface utilisateur dans un fragment d'apporter des modifications à l'échelle d'activité

Cas particulier : J'ai deux fragments, hébergés dans la même activité. Lorsque l'utilisateur clique sur un bouton dans un de ces fragments, je veux qu'il soit remplacé par l'autre.

ne veulent pas , cependant, mes fragments touchant mon activité. Je voudrais peut-être changer le comportement plus tard (peut-être, dans un plus grand écran, montrent les deux fragments au lieu de remplacer le premier), et je ne veux pas que mon code Fragment d'avoir cette logique.

Ce que je faisais était de mettre en œuvre une classe Listener dans mes fragments, que les événements d'un rapport au Activity. De cette façon, si je veux utiliser une autre classe Activity avec le comportement d'affichage différent, je peux simplement changer l'auditeur et laisser le code Fragment intact.

Est-ce une bonne façon d'aller à ce sujet? Y at-il une norme de bonnes pratiques, ou un meilleur modèle de conception?

Était-ce utile?

La solution

Utilisation des écouteurs est la méthode recommandée pour la communication entre les fragmenter et votre activité.

Voir cette Android documentatin section pour infromation. Longue histoire courte ils ont juste mettre en œuvre une interface auditeur par la classe d'activité et jettent résultat getActivity () dans un fragment à un auditeur.

De mon expérience personnelle c'est parce que très pratique vous permet de:

  1. commutateur easilly activité sous-jacente (par exemple vous hébergez fragment entier dans une activité d'emballage pour la compatibilité en pré-3.0 et l'hôte ce fragment ainsi que d'autres en 11 +)
  2. contrôle easilly si l'activité d'emballage prend en charge callbacks ou non. Il suffit de cocher est-il fait mettre en œuvre l'auditeur et faire vos actions spécifiques d'application si elle ne fonctionne pas.

Autres conseils

Vous avez raison à propos de l'utilisation d'un Listener. C'est quelque chose que j'ai aussi eu à traiter dans un projet au travail. La meilleure façon de le gérer est de faire autonome du fragment dans la nature. Tout ce qui souhaite interagir avec le fragment devrait utiliser son API publique et / ou auditeurs fixés pour des événements spécifiques. Si vous connaissez Design Patterns , c'est le Observateur modèle . Les événements peuvent être générales ou spécifiques, ainsi que contenir des données ou aucune donnée.

À titre d'exemple de mon projet, j'avais deux fragments. A ListFragment et un InfoFragment qui affiche le ListItem sélectionné. Le ListFragment a déjà une interface Listener pour mon activité à crochet dans, mais le InfoFragment ne depuis sa base de votre Fragment. J'ai ajouté une interface Listener au InfoFragment qui serait avisé lorsque le Fragment voulait fermer. Pour le Fragment, cela pourrait être une presse de bouton ou une action spécifique survenu, mais pour autant que mon activité concerne, lorsque l'événement est déclenché, il fermerait la vue Fragment.

Ne pas avoir peur d'utiliser beaucoup de fragments pour les auditeurs, mais aussi essayer de les regrouper par une action spécifique en utilisant des paramètres de données pour les individualiser. Espérons que cela aide!

Une réponse technique pour:

J'ai deux fragments, hébergés dans la même activité. Lorsque l'utilisateur clique sur un bouton dans un de ces fragments, je veux qu'il soit remplacé par l'autre.

    FragmentTransaction ft = this.getFragmentManager().beginTransaction();
    Fragment mFragment = Fragment.instantiate(this.Activity(), Fragment2.class.getName());
    ft.replace(android.R.id.content, mFragment);
    ft.commit();
public class Example_3_Mainfile extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
         setContentView(R.layout.example_3_mainfile);

                 Fragment fr ;//make class that extend to thefragment 
                 fr = new Act_2_1();                 
                     FragmentManager fm = getFragmentManager();
                     FragmentTransaction fragmentTransaction = fm.beginTransaction();
                     fragmentTransaction.replace(R.id.fragment_place, fr);
                    //id get of fragment tag  from xml file there decelar
                     fragmentTransaction.commit();
                     }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top