2011-10-23 3 views
8

Je souhaite implémenter une conception de multi-fragmentation mono-activité dans mon application. Je prévois d'avoir plusieurs "écrans" (layouts de Fragment) que je vais basculer entre (éventuellement en ajoutant back-stack) dans le code. A ma connaissance, la disposition des fragments dans chaque écran est définie à l'aide d'objets Layout (par exemple FrameLayout), qui agissent comme des espaces réservés pour les fragments (partageant le même ID). Puisque différents écrans ont des arrangements de Fragment différents (on pourrait être FrameLayout, et un autre LinearLayout, etc.) je me demandais: Comment puis-je basculer entre les mises en page de fragments en cours d'exécution?Android - Modification de la disposition des fragments en cours d'exécution

Je comprends l'ajout/le remplacement de Fragments (via FragmentManager), mais j'aimerais ajouter complètement une nouvelle disposition qui les contient, dans une activité en direct. Un peu comme avoir des transactions pour "setContentView" ...

Comment faire? Merci! Danny.

+0

J'ai posté un code multi-fragments mono-activité ici: http://stackoverflow.com/questions/7797389/how-avoid-re-initializing-activity-that-a-long-time-to-initilize/ 7799391 # 7799391 – user999717

+0

Merci pour la réponse rapide. Cependant, je pense que la commutation entre les fragments dans la même mise en page comme le montre votre exemple ('R.id.mainframe'), ne résout pas mon problème, qui est comment basculer entre les mises en page de fragments. Spécialement si les mises en page sont créées en code (après onContentView est appelé), comme mon cas. – DannyA

+0

Oh je vois, donc vous voulez re-parent des fragments existants sans les ré-instancier? C'est intéressant. – user999717

Répondre

4

C'est certainement possible, la seule chose que vous devez faire est de générer vos propres ID. Les identifiants peuvent être tout sauf qu'ils ne doivent pas entrer en conflit avec les identifiants aapt (ceux de R) et ne doivent pas être négatifs.

L'exemple suivant illustre cela avec un ensemble d'ID fixes:

public class MainActivity extends Activity { 
    private final int ID_TABLE = 0xA; 
    private final int ID_ROW1 = 0xB; 
    private final int ID_ROW2 = 0xC; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     LinearLayout ll = (LinearLayout) findViewById(R.id.root); 
     TableLayout tl = new TableLayout(this); 
     tl.setId(ID_TABLE); 
     TableRow tr1 = new TableRow(this); 
     tr1.setId(ID_ROW1); 
     TableRow tr2 = new TableRow(this); 
     tr2.setId(ID_ROW2); 
     tl.addView(tr1); 
     tl.addView(tr2); 
     ll.addView(tl); 

     MyFragment frag1 = new MyFragment(); 
     MyFragment frag2 = new MyFragment(); 
     MyFragment frag3 = new MyFragment(); 
     MyFragment frag4 = new MyFragment(); 

     getFragmentManager().beginTransaction() 
      .add(ID_ROW1, frag1, "cell1_1") 
      .add(ID_ROW1, frag2, "cell1_2") 
      .add(ID_ROW2, frag3, "cell2_1") 
      .add(ID_ROW2, frag4, "cell2_2") 
      .commit(); 
     getFragmentManager().executePendingTransactions(); 
    } 
} 

Pour passer à une autre mise en page, vous pouvez supprimer les fragments et les ajouter ailleurs. Laissez-moi savoir comment ça se passe.

EDIT: pour clarifier, Views et ViewGroups n'ont pas besoin d'être instanciés une seule fois et conservés pendant la durée de vie de l'activité. Assurez-vous simplement que tous les fragments sont retirés ou détachés avant de supprimer leur vue associée. En outre, si vous créez et supprimez des vues en dehors d'onCreate, vous devez vous assurer qu'il peut être restauré en utilisant onSaveInstanceState et en répétant le processus dans onCreate. Lire le diagram here et le paragraphe à propos de configuration changes.

+0

Merci pour l'effort! Comme je suis un débutant Android, je veux m'assurer que je vous ai bien compris - est-il correct d'ajouter/supprimer des vues et des mises en page de la vue principale de mon activité à peu près n'importe où dans mon code? ne pense pas que j'ai vu des exemples pour cela), puis créer et ajouter des fragments à la volée? C'est un peu plus que simplement "enlever les fragments et les ajouter ailleurs", parce que je crée une nouvelle mise en page pour eux. – DannyA

+0

Le but est finalement de séparer cette logique de fragmentation en différentes classes "screen", et d'avoir chaque classe au courant de ses propres IDs de mise en page, et y mettre ses propres fragments. Ensuite, je peux naviguer d'un "écran" à l'autre via des transactions de fragment. par exemple. masque tous les fragments de l'écran précédent et affiche les nouveaux fragments à la place. Je dois avouer que cette technique me semble un peu étrange, car elle va inonder mon activité de mises en page vides avec des fragments invisibles ... Il semble que mon objectif soit raisonnable mais je n'ai pas trouvé le design correct pour ça. – DannyA

+0

Eh bien c'est un train de pensée intéressant, mais n'est-ce pas exactement ce que les activités et leur méthode startActivity (Intent) ont été faites? Vous récupérez également la fonctionnalité du bouton gratuitement. – user999717

Questions connexes