web-dev-qa-db-fra.com

Comment naviguer jusqu'au même état parent

D'après mon observation de Gmail et de l'application TED, le comportement de la navigation ascendante indiquera le même état (position de défilement) que ce que Google dit dans leur doc Implement Up Navigation qui, comme, crée une intention parent et la lance. . 

J'implémente le code de l'exemple de code Android et tous les états ont disparu (tous les paramètres supplémentaires que j'ai définis et la position de défilement). Quelle est la bonne façon de procéder? Je ne trouve aucun document sur Android.

Ci-dessous le code:

public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case Android.R.id.home:
        Intent upIntent = new Intent(this, MyParentActivity.class);
        if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
            // This activity is not part of the application's task, so create a new task
            // with a synthesized back stack.
            TaskStackBuilder.from(this)
                    .addNextIntent(new Intent(this, MyGreatGrandParentActivity.class))
                    .addNextIntent(new Intent(this, MyGrandParentActivity.class))
                    .addNextIntent(upIntent)
                    .startActivities();
            finish();
        } else {
            // This activity is part of the application's task, so simply
            // navigate up to the hierarchical parent activity.
            NavUtils.navigateUpTo(this, upIntent);
        }
        return true;
}
return super.onOptionsItemSelected(item);

}

Dans mon cas, j'ai trois activités, à savoir AB et C, lorsque l'utilisateur navigue de A à BI, ajoute des extras et onCreate d'utilisation de ces extras pour interroger les données de la base de données afin de renseigner mes lignes et lorsque je retourne de C, L'activité B ne montre rien.

36
sarunw

Le comportement "standard" d'une activité Android consiste à créer une nouvelle instance de l'activité chaque fois qu'il existe une nouvelle intention pour cette activité (voir launchMode-docu here ). Pour cette raison, vos extras semblent avoir disparu, si vous appelez browseUpTo.

Dans votre cas, je vous conseillerais d'utiliser 

Android:launchMode="singleTop"

pour votre activité parent dans votre AndroidManifest.xml. De cette façon, vous retournerez à votre activité existante (tant qu'elle se trouve en haut de la pile arrière de votre tâche). De cette façon, vos extras seront préservés.

Moi aussi, je ne comprends pas pourquoi cela n'est pas mentionné dans le document Google que vous citez, car cela semble être le comportement auquel on s'attend si on utilise la navigation ascendante.

91
yonojoy

C'est une solution alternative à la réponse acceptée :

Si vous ne pouvez pas modifier la launchMode de votre activité ou si l'activité parent ne se trouve pas au sommet de la pile arrière (par exemple, A est le parent de C), vous ne pouvez pas utiliser la solution ci-dessus . Dans ce cas, vous devez étendre votre appel navigateUpTo pour indiquer à l'activité qu'elle ne doit pas être recréée, si elle se trouve dans la pile arrière:

Intent intent = NavUtils.getParentActivityIntent(this); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
NavUtils.navigateUpTo(this, intent);
12
yonojoy

vous pouvez utiliser ceci:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case Android.R.id.home:
            super.onBackPressed();
            return true;
    }
    return super.onOptionsItemSelected(item);
}
1
Moaz Rashad

J'avais un problème similaire lorsque j'ai appelé startActivityForResult () dans mon activité principale avec des fragments, puis que j'essayais d'y revenir depuis l'appelé à l'aide de la navigation haut.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case Android.R.id.home:
            setResult(RESULT_CANCELED);
            finish();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

Dans ce cas, le bouton Haut se comporte comme un bouton Précédent ordinaire et tous les états sont conservés.

1
Alexander Zhak

Vous devez enregistrer l'état de l'activité parent et le récupérer après le retour de l'appelant.

Voir Enregistrement de l'état d'activité Android à l'aide de l'option Enregistrer l'état de l'instance pour une explication complète du traitement préalable, avec code.

0
rgrocha