Fragments: supprime tous les fragments d'une vue
Le scénario, je suis confronté à, est dans mon application j'ai un seul volet et double volet style de mise en page. Plutôt que de gérer individuellement chaque navigation entre les écrans, pour chaque style de mise en page, je suis en utilisant une fonction qui définit la mise en page correctement face à l'écran souhaité.
Il est fondamentalement un switch
déclaration pour chaque écran dans l'application, avec un imbriquée switch
instruction dans chaque écran pour chaque style de mise en page. C'est ce que je parle dans le code:
protected void setupScreen() {
switch(currentScreen) {
case SCREEN_ONE:
switch(currentLayout) {
case SINGLE_PANE:
//Perform actions to setup the screen
break;
case DUAL_PANE:
//Perform actions to setup the screen
break;
}
break;
case SCREEN_TWO:
switch(currentLayout) {
case SINGLE_PANE:
//Perform actions to setup the screen
break;
case DUAL_PANE:
//Perform actions to setup the screen
break;
}
break
//... etc ....
}
}
Dans la section où je veux effectuer les actions pour l'installation de l'écranelle comprend les éléments suivants de base de trois opérations:
//Create the fragments if necessary
if (screenFragment == null) {
screenFragment = new myFragment();
}
//Remove the existing fragments from the layout views
//HOW???
//Add the fragments for this screen to the view
getSupportFragmentManager().beginTransaction().add(pane1.getId(), myFragment, "myFragment").commit();
Comme vous pouvez le voir, ce que je suis aux prises avec le comment pour la deuxième étape. Comment ne vous supprimez tous les Fragment
s à partir d'un donné View
sans savoir exactement quels sont ceux que vous êtes désireux de le supprimer? Le plus proche que j'ai trouvé est FragmentTransaction.replace()
qui n'a réussi à le faire pour chaque cas mais quand il s'avère que vous remplacez un Fragment
avec le même fragment. Dans ce cas, il ne permet pas de supprimer tout, puis ajouter (comme le suggère la documentation), il me semble que pour le retirer. Est-ce un problème avec l'aide de la compatibilité des bibliothèques ou n'est-il pas le chemin FragmentTransaction.replace()
doit être utilisé?
En tout cas, comment dois-je faire? Dois-je code un removeAllFragments()
fonction de parcourir chaque fragment et de la détacher ou est-il un moyen de faire de la première moitié de ce que le "deux en un" FragmentTransaction.replace()
fonction prétend faire?
source d'informationauteur B T | 2013-02-08
Vous devez vous connecter pour publier un commentaire.
Le mécanisme classique est d'utiliser
FragmentManager.findFragmentByTag()
. Vous utilisez cette et ajouter des tags à vos fragments (ou l'alternative pour l'id). De cette façon, vous pouvez déterminer ce que les fragments sont actuellement gérés. Ensuite, une fois que vous avez une poignée pour un présent fragment (findFragmentByTag renvoie non-nulle), vous pouvez utiliserFragmentManager.beginTransaction()
pour démarrer une FrgamentTransaction et de supprimer /ajouter le nécessaire fragments. Le travail de cette façon vous permettra d'éviter le " re-ajout de processus pour la fragment que vous souhaitez conserver.Ce que je serais probablement faire est d'avoir un code comme ça: (attention pseudo code)
Vous devriez également considérer les sous-classes de la classe au lieu d'avoir tout en un de la classe. Vous avez une façon assez évidente cas de Martin Fowler Remplacer Conditionnelle avec la sous-classe. Sinon, j'ai peur que cela va être extrêmement difficile à manager lorsque vous ajoutez un autre écran.
Aucune des autres réponses ont été vraiment pour moi. Voici ce que j'ai fait:
ou, si vous êtes obligé de l'utiliser (mais non recommandé):
Aussi, si vous êtes à la suppression de tous les fragments de la vue plusieurs fois, vous pourriez envisager de vérifier si le frag est null ou
isDetached()
ouisRemoving()
ou vous pourriez obtenirNullPointerExceptions
.Mise à jour: La documentation
getSupportFragmentManger().getFragments()
est apparemment caché maintenant, mais fonctionne encore très bien dans mon code. Voici la capture d'écran de la documentation:Avoir dit que, puisqu'il est caché, ils ne veulent plus de cette méthode, afin de voir ma mise à jour ci-dessous.
Mise à jour 8-4-15: Si vous n'êtes pas à l'aide de la bibliothèque de prise en charge pour des fragments, il n'est malheureusement pas
getFragments()
disponibles, mais il y a toujours un couple, plus pratique, options.fragment
untag
ouid
lors de la création, et itérer le processus chaquefragment
comme souhaité.onAttachListener
de sorte que chaque fois qu'un nouveaufragment
est attaché à laactivity
vous pouvez la stockerfragment
puis itérer à travers cette structure de données à traiter chaquefragment
comme souhaité.Lorsque vous n'utilisez pas le
getSupportFragmentManager()
pour traiter une transaction, vous devrez utilisergetFragmentManager()
à la place.Si vous utilisez android.de soutien.v4.app.Fragment vous pouvez faire ceci:
S'avère
FragmentTransaction.replace()
est le fonctionnement correct et devrait fonctionner correctement. Il ne fonctionne pas lors de l'utilisation deActionBarSherlock
etSherlockFragmentActivity
donc je ne peux que supposer que c'est un bug dans cette bibliothèque de compatibilité.J'ai confirmé ce grâce à l'aide du code ci-dessous pour mettre en œuvre le comportement souhaité par l'intermédiaire d'Android sur API11+, android bibliothèque de compatibilité, et ActionBarSherlock. Il ne le viole qu'en dernière instance.
C'est plus ou moins la façon dont j'ai géré cette. Tous vos fragments de mettre en œuvre une interface quelque chose comme:
Faire un enum correspondant à vos fragments:
Puis dans votre fragment de commutation de l'activité:
Vous aurez à changer les choses autour un peu pour s'adapter à vos données personnelles.