comment remplacer le bouton de retour de la barre d'action dans Android?


95

Je souhaite personnaliser le bouton de retour d'activité dans la barre d'action, pas dans le bouton de retour à clé matérielle. J'ai remplacé la onBackPressed()méthode. Cela fonctionne avec le bouton de retour de mon émulateur, mais pas avec le bouton de retour de la barre d'action.

Je veux que cela se produise avec la barre d'action. Comment puis-je faire ceci?

Voici mon code:

@Override
public void onBackPressed() {
    Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
    return;
}

J'ai utilisé ce toast, que la pression arrière fonctionne ou non, mais les changements de mise en œuvre réels aiment revenir à l'activité précédente. Mais cela ne fonctionne pas avec le bouton présent en haut de la barre d'action (en plus du titre de l'activité).

S'il vous plaît, n'importe qui pourrait me préciser le problème.

Réponses:


210

Je pense que vous souhaitez remplacer l'opération de clic du bouton d'accueil. Vous pouvez remplacer cette fonctionnalité de cette manière dans votre activité.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        Toast.makeText(getApplicationContext(),"Back button clicked", Toast.LENGTH_SHORT).show(); 
        break;
    }
    return true;
}

1
Noah Ibrahim, En fait, il y a un bouton Retour dans le coin supérieur gauche comme le bouton Retour dans le navigateur. Lorsque je clique sur ce bouton, je veux revenir à l'activité précédente. Pas comme le code que vous avez publié ci-dessus.
GK

4
ajoutez super.onBackPressed (); to it
redestructa

2
Cela a fonctionné pour moi après avoir changé return true;à return super.onOptionsItemSelected(item). Ensuite, vous pouvez faire quelque chose lorsque l'utilisateur clique sur le bouton de retour de la barre d'action, tout en conservant la même fonctionnalité du bouton.
kumaheiyama

Par cette technique, le bouton fléché de retour répond en retard. Cela signifie que je dois attendre une seconde pour que l'événement soit déclenché. N'apparaissant pas non plus le sélecteur sur ce bouton pour l'effet tout en appuyant dessus
Gopal Singh Sirvi

Cela n'a pas fonctionné pour moi. Lorsque j'ai débogué, j'ai trouvé les identifiants du bouton d'accueil et l'identifiant du bouton cliqué différemment.
viper

45

Si vous voulez que le bouton de retour ActionBar se comporte de la même manière que le bouton de retour matériel:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == android.R.id.home) {
                    onBackPressed();
                    return true;
            }
            return false;
    }

1
l'affaire android.R.id.homene tire pas
Trancer

2
@Trancer si vous l'utilisez dans Fragment, vous devez également appeler setHasOptionsMenu(true)la méthode onCreate de fragment
wilddev

10

Deux choses à garder à l'esprit que l'utilisateur peut soit appuyer sur le bouton retour, soit appuyer sur le bouton d'accueil de la barre d'actions.
Donc, si vous souhaitez le rediriger vers la même destination, vous pouvez le faire.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
    }
    return false;
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
    startActivity(intent);
    finish();
}

Cela amènera l'utilisateur à l'intention en appuyant sur l'une des touches ou sur le bouton de la barre d'action.


l'affaire android.R.id.homene tire pas
Trancer

@Trancer, cela fait presque plus d'un an et demi. Et je ne fais pas d'android maintenant. Je ne peux pas t'aider maintenant. Désolé.
ssi-anik

alors quelle est la solution?
GA1

7
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
                switch (item.getItemId()) {
                case android.R.id.home:
                       finish();
                   break;
                }
                return true;
        }

2
Vous auriez pu l'ajouter en commentaire. C'est plus ou moins la même chose que la réponse acceptée.
Sufian

7

Désolé, la mienne est une réponse tardive, mais pour quiconque arrive sur cette page avec la même question, j'ai essayé ce qui précède:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
  ...
  if (item.getItemId() == android.R.id.home) {
    ....
  }
  ....
}

mais cela n'a pas réussi à attraper la pression sur le bouton "Retour".

Finalement, j'ai trouvé une méthode qui a fonctionné pour moi sur https://stackoverflow.com/a/37185334/3697478 qui consiste à remplacer le "onSupportNavigateUp ()" car j'utilise la barre d'action de la bibliothèque de support "AppCompatActivity". (Il existe un équivalent "onNavigateUp ()" pour la nouvelle bibliothèque de barres d'actions / barres d'outils.)

@Override
public boolean onSupportNavigateUp(){  
  finish();  
  return true;  
}

et j'ai supprimé la section "android: parentActivityName =". MainActivity "du fichier manifeste.


4

J'ai réalisé ceci, en utilisant simplement deux étapes,

Étape 1: Accédez à AndroidManifest.xml et ajoutez le paramètre dans la balise - android: parentActivityName = ". Home.HomeActivity"

exemple :

 <activity
    android:name=".home.ActivityDetail"
    android:parentActivityName=".home.HomeActivity"
    android:screenOrientation="portrait" />

Étape 2: dans ActivityDetail, ajoutez votre action pour la page / activité précédente

exemple :

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

2

Si vous souhaitez revenir à l' instance précédente d'une activité en appuyant sur le bouton d'accueil d'ActionBar, sans la recréer , vous pouvez remplacer la méthode getParentActivityIntent pour utiliser celle de la pile arrière:

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public Intent getParentActivityIntent() {
      return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
}

EDIT:
Vous pouvez également obtenir le même résultat en
définissant le launchMode de votre activité parent sur singleTop.
Alors, définissez l' android:launchMode="singleTop"activité des parents dans votre manifeste.
Vous pouvez également utiliser l'indicateur FLAG_ACTIVITY_CLEAR_TOP avec l'intention UP.
reference: Fourniture de la navigation


2

(1) Ajouter une activité parent pour votre activité enfant (AndroidManifest.xml)

<activity
        android:name=".ParentActivity" />

(2) remplacer la méthode onSupportNavigateUp dans l'activité enfant

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return false;
}

0
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == android.R.id.home) {
        onBackPressed();
        return true;
    }
    //noinspection SimplifiableIfStatement
    if (id == R.id.signIn) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
///////////////////
@Override
public void onBackPressed() {
    super.onBackPressed();
    finish();
}

0

Il existe plusieurs façons de configurer le bouton de retour dans la barre:

1) la méthode le .setDisplayHomeAsUpEnabled(true);fera, puis vous pouvez simplement remplacerandroid.R.id.home

2) l'ajout <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="my.package.parrent" />dans le manifeste Android, mais dans ce cas, vous ne pouvez pas remplacer android.R.id.homedans OnOptionsMenuSelected.

.. pour ceux qui se demandent pourquoi cela ne fonctionne pas pour eux ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.