À l'aide de ActionBar de la Navigation en mode maître/détail des fragments
J'ai une application maître/détail de mise en page (1, 1 ListView fragment et 1 détail fragment). Lorsque l'utilisateur clique sur un élément dans la liste, un fragment de transaction instancie un détail fragment sur le volet de droite qui contient les informations correspondant à cet élément. Lorsque le détail fragment est indiqué, je me cache dans l'action initiale de la barre de boutons/articles et de montrer les 3 nouveaux AB éléments (fait/supprimer/annuler). L'utilisateur peut nettoyer le volet de droite et de retour à l'initiale de l'INTERFACE utilisateur de l'état, en appuyant sur le bouton de retour ou en appuyant sur l'un des 3 AB éléments.
La question que je suis en train de vivre, c'est que lorsque l'utilisateur sélectionne l'application de l'icône accueil (c'est à dire "navigation") l'activité est re-chargé (c'est à dire l'animation qui indique que l'activité est de départ peut être considéré à la fois comme la barre d'action et l'INTERFACE utilisateur est redessiné). Le problème se produit uniquement lorsque l'application icône accueil est pressé. Si l'utilisateur appuie sur le bouton retour ou annuler/fait/action de suppression de la barre de bouton, le fragment est tout simplement de supprimer le droit-volet et l'INTERFACE utilisateur retourne à l'état initial, sans "re-chargement".
Le XML de mise en page pour l'activité est la suivante (à l'intérieur de LinearLayout; embellir cache que ligne):
<fragment class="*.*.*.ListFragment"
android:id="@+id/titles" android:layout_weight="1"
android:layout_width="0px"
android:layout_height="match_parent" />
<FrameLayout android:id="@+id/details" android:layout_weight="2"
android:layout_width="0px"
android:layout_height="match_parent" />
La DetailsFragement a l'actionBar.setDisplayHomeAsUpEnabled énoncé dans sa méthode onCreate:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
ActionBar actionBar = getSherlockActivity().getSupportActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
}
Pour la ListView fragment et le Détail des fragments de la onCreateOptionsMenu() et onOptionsItemSelected() la méthode sont mises en œuvre dans les fragments. Ci-dessous le code pour plus de Détails fragment:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.edit_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//some variable statements...
switch (item.getItemId()) {
case android.R.id.home:
//Toast.makeText(getSherlockActivity(), "Tapped home", Toast.LENGTH_SHORT).show();
onHomeSelectedListener.onHomeSelected();
return true;
case R.id.menu_edit_item_done:
editedTask.setTitle(editedTaskTitle);
onTaskEditedListener.onTaskEdited(editedTask, UPDATE_TASK, true);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Dans l'activité de l'hôte-je mettre en œuvre la onHomeSelectedListner pour gérer l'app icône accueil appuyez sur (c'est à dire "navigation":
public void onHomeSelected(){
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
TaskFragment taskFragment = (TaskFragment)getSupportFragmentManager().findFragmentById(R.id.details);
ft.remove(taskFragment);
ft.commit();
manager.popBackStack();
}
L'activité de l'auditeur chargé de la manutention de tous les autres boutons de la barre (c'est à dire fait/supprimer/annuler) est onTaskEditedListener et, à côté de l'autre code qui traite des données, il a le même fragment de celles indiquées ci-dessus.
Mise à jour(1/24)
Basé sur tyczj et straya commentaires que j'ai mis du journal des états à l'intérieur de onCreate(), onResume(), onPause() de l'activité pour déterminer les différences entre onHomeSelected et onTaskEdited auditeurs. Je suis en mesure de confirmer que lors de la "navigation" de l'événement (c'est à dire onHomeSelected) onPause(), onCreate() et onResume() est appelé. Alors que pendant la onTaskEdited appel (c'est à dire de bouton de retour ou faire/supprimer/annuler appuyez sur) aucun de ces événements sont appelés.
Mise à jour (1/25)
Basé sur une suggestion faite par Mark Murphy, j'ai commenté la onHomeSelected appel de la méthode dans le cas "d'android.R.id.accueil" déclaration juste pour voir ce qui l'Activité n'. La pensée était que l'application serait de ne rien faire depuis le sont pas consolidés. S'avère que ce n'est pas le cas. Même sans un appel à la méthode écouteur (c'est à dire qui supprime le fragment), l'activité est redémarré et le détail fragment est supprimé à partir du fragment de récipient.
Mise à jour (2/28)
Je contourner temporairement le fait que mon activité principale était de se reprend par la désactivation de la fenêtre d'animations (comme mis en évidence dans ma propre réponse). Cependant, grâce à des tests plus j'ai découvert un bug. Grâce à Wolfram Rittmeyer exemple de code que j'ai été capable de comprendre la vraie raison(s) mon activité était en train de redémarrer (en mode maître/détail de mise en page unique) au cours de la navigation:
1) Bien que j'ai été en utilisant ce "onHomeSelectedListener" supprimer correctement le fragment de la backstack, j'avais encore quelques restes de code dans la liste du fragment onOptionsItemSelected qui a été la création d'une nouvelle intention de démarrer l'activité d'hébergement. C'est pourquoi appuyant sur l'app icône accueil a été re-démarrage de l'activité.
2) Dans mon final de mise en œuvre (indiqué dans ma réponse), je me suis débarrassé de la onHomeSelectedListener à l'activité et à remplacer le startActivity intention (c'est à dire code fautif) à l'intérieur de la liste de onOptionsItemSelected à utiliser le fragment de suppression de + popBackStack code à l'origine dans le onHomeSelectedListener.
- Il peut être intéressant de noter que les Tâches que l'application utilise une seule Activité et de affiche/masque les fragments de maître/détail de la configuration, plutôt que d'avoir plusieurs activités. Vérifier ce post google+ et les commentaires.
- En mode maître/détail de la configuration, je suis également à l'aide d'une seule activité. J'ai lu que G+ post avant. Bien qu'il n'a pas examiné la question de la navigation (comme se rapportant à cette question), il a servi comme un rappel à aborder le problème de la "rotation de la stabilité", donc merci pour le partage!
Vous devez vous connecter pour publier un commentaire.
Après beaucoup de recherche et de fouiller, s'avère que la seule raison pour laquelle mon activité était en train de redémarrer au cours de "navigation" pour maître/détail de la configuration parce que j'ai laissé un peu de code dans la liste du Fragment onOptionsItemSelected qui a été la création d'une intention de démarrer l'activité principale, en plus de mon plein fragment de code de transaction ailleurs. Ci-dessous est la mise en œuvre finale avec qui j'ai eu "la navigation" pour travailler correctement sur le téléphone (activités multiples) et la tablette (activité unique/multi-volet) configurations. Grâce à Wolfram Rittmeyer pour un couple de conseils dans son code (lien dans la section des commentaires) que m'aider à identifier mon problème!
Activité principale: Hôtes les fragments et effectue quelques autres spécifiques à l'application les opérations de
ListView Fragment: Poignées "de la navigation dans le tableau de configuration
Détails de Fragment: Poignées de navigation haut dans la configuration du téléphone
Si vous regardez la De Navigation Modèle De Conception vous verrez que vous souhaitez retourner au démarrage de l'activité lorsque le bouton est frappé.
Donc, dire, vous avez 2 Activités appeler
A1
etA2
. En cliquant sur quelque chose dans A1 vous emmène à A2. Si l'utilisateur appuie sur le bouton home, vous devriez retourner à A1 de compensation de la pile de tout jusqu'à ce que l'activité de ce genrec'est ce que le drapeau
Intent.FLAG_ACTIVITY_CLEAR_TOP
neaddToBackStack("fragmentname")
au lieu deaddToBackStack(null)
puis quand le bouton d'accueil est frappé vous utilisez.popBackStack("name of fragment you wan to go back to", FragmentManager.POP_BACK_STACK_INCLUSIVE)
n'est pas le cas: pause et revenir ensuite super.onOptionsItemSelected(item), plutôt juste: return true;
Mise à JOUR:
De sorte que vous êtes en train de dire que l'Activité est "redémarré" basé sur ce que vous voyez arriver avec des points de Vue, mais pouvez-vous confirmer ce qui peut ou peut ne pas arriver à l'Activité (et de Fragments d'ailleurs) par l'utilisation de la journalisation dans les différentes du cycle de vie des méthodes? De cette façon, vous pouvez être sûr de ce que l'actuel (erronée) le comportement est avant d'aller de l'avant avec le diagnostic.
Mise à JOUR:
OK, bon pour être sûr de comportement 🙂
Maintenant en ce qui concerne votre question "Quelle est la bonne façon de mettre en œuvre "navigation" pour un maître/détail de mise en page (1 activité/2fragments)? ":
La méthode classique est que les 2 Fragments ont été ajoutés à l'intérieur d'un seul FragmentTransaction et il vous suffit de popBackStack pour les supprimer et revenir à ce que l'état précédent était. Je pense que vous êtes doublement par la suppression manuelle d'un Fragment à l'intérieur d'un FragmentTransaction et puis popping backstack. Essayez juste de popBackStack. Oh, et juste pour être sûr et cohérent, puisque vous êtes à l'aide de ActionBarSherlock et de soutien.v4 êtes-vous à l'aide d'un FragmentActivity (plutôt que d'une Activité) et SherlockFragment?
Je pense que vous devez gérer le bouton vers le Haut uniquement à l'intérieur de l'activité.
Si vous êtes dans un téléphone, le bouton sera traitée par l'activité qui agit comme un wrapper de ce fragment, en tablette (maître/détail du motif) vous ne voulez pas de toute façon