À 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!
InformationsquelleAutor cavega | 2013-01-23