Android - Bouton Retour dans la barre de titre

112

Dans de nombreuses applications (Calendrier, Drive, Play Store), lorsque vous appuyez sur un bouton et entrez une nouvelle activité, l'icône dans la barre de titre se transforme en bouton de retour, mais pour l'application que je crée, cela ne le fait pas. Comment puis-je faire en sorte que cette icône vous ramène à l'écran précédent?

A dessiné
la source
Essayez getSupportActionBar () dans l'exemple OnCreate ici freakyjolly.com/how-to-add-back-arrow-in-android-activity
Code Spy

Réponses:

146

Il existe deux étapes simples pour créer un bouton de retour dans la barre de titre:

Tout d'abord, rendez l'icône de l'application cliquable à l'aide du code suivant dans l'activité dont vous souhaitez insérer un bouton de retour dans la barre de titre:

ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);

Après avoir ajouté le code ci-dessus, vous verrez une flèche de retour apparaître à gauche de l'icône de l'application.

entrez la description de l'image ici

Deuxièmement, après avoir fait ce qui précède, vous devez toujours créer un code qui tirera parti de l'événement de clic. Pour ce faire, sachez que lorsque vous cliquez réellement sur l'icône de l'application, une onOptionsItemSelectedméthode est appelée. Donc, pour revenir à l'activité précédente, ajoutez cette méthode à votre activité et mettez-y du Intentcode qui vous ramènera à l'activité précédente. Par exemple, disons que l'activité à laquelle vous essayez de revenir est appelée MyActivity. Pour y revenir, écrivez la méthode comme suit:

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), MyActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}

C'est tout!

(Dans l'API des développeurs Android, il recommande de jouer avec le manifeste et d'ajouter des éléments tels que android:parentActivityName. Mais cela ne semble pas fonctionner pour moi. Ce qui précède est plus simple et plus fiable.)

<meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value=".MainActivity" />

Et dans votre activité

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
Luc F.
la source
23
Vous avez bien expliqué, mais si ce n'est pas faux dans votre onOptionItemSelected, vous devez simplement appeler finish (); dans votre cas, startActivityForResult lancera la deuxième activité et lorsque vous reviendrez de la deuxième activité, vous serez renvoyé à la première activité (où vous avez appuyé sur l'icône de la barre d'action)
Yahya Arshad
8
De plus, vous ne devriez le faire que si item.getItemId () est android.R.id.home
bitek
2
Comme l'indique AS: "L'invocation de méthode 'actionBar.setDisplayHomeAsUpEnabled (true)' peut produire java.lang.NullPointerException"
statosdotcom
1
Avertissement! Avec une ToolBar actionBar renvoie null avec crash. Voir les réponses ci-dessous.
CoolMind
5
getActionBar () ne fonctionnait pas pour moi, l'application plante juste. getSupportActionBar () a fonctionné.
john ktejik
60

utiliser ce code

 @Override
 public void onCreate(Bundle savedInstanceState) {
    ...
   getActionBar().setDisplayHomeAsUpEnabled(true);
 } 

après cela, écrivez ce code dans la onOptionsItemSelectedméthode

  int id = item.getItemId();

     if (id==android.R.id.home) {
        finish();
    }
anupam sharma
la source
1
getActionBar()me donne un nul; est-ce que tu sais pourquoi?
msysmilu
3
car il n'y a pas ActionBar, par exemple avec le style <item name = "android: windowActionBar"> false </item> <item name = "android: windowNoTitle"> true </item>
Paul Verest
48

J'ai enfin réussi à ajouter correctement le bouton de retour à la barre d'action / barre d'outils

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}  

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

    return super.onOptionsItemSelected(item);
}

public boolean onCreateOptionsMenu(Menu menu) {
    return true;
}
Lucy Fair
la source
3
C'est la seule réponse qui fonctionne pour moi. Merci @LucyFair
Arda Çebi
2
Même. Merci pour votre réponse.
Maria le
Même. Aucune des autres réponses ne fonctionne. Cela aurait dû être la réponse acceptée.
El Sushiboi le
18

1.- Ajoutez l'activité à AndroidManifest.xml et assurez-vous de fournir les méta-données:

<activity
    android:name="com.example.myfirstapp.DisplayMessageActivity"
    android:label="@string/title_activity_display_message"
    android:parentActivityName="com.example.myfirstapp.MainActivity" >
    <!-- Parent activity meta-data to support 4.0 and lower -->
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.myfirstapp.MainActivity" />
</activity>

2.- Ajoutez le code suivant à la méthode onCreate de l'activité:

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
} 

3.- Remplacez la méthode onOptionsItemSelected et utilisez la méthode statique NavUtils.navigateUpFromSameTask () pour naviguer dans la pile.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

Cependant, l'utilisation de navigateUpFromSameTask () ne convient que lorsque votre application est le propriétaire de la tâche actuelle (c'est-à-dire que l'utilisateur a commencé cette tâche à partir de votre application). Si ce n'est pas le cas et que votre activité a été démarrée dans une tâche qui appartient à une autre application, la navigation vers le haut devrait créer une nouvelle tâche qui appartient à votre application, ce qui nécessite la création d'une nouvelle pile arrière.

Spacebiker
la source
Merci d'avoir présenté les NavUtils!
AntonSack
10

Si votre activité prolonge l'activité

public class YourActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xxx);

        getActionBar().setHomeButtonEnabled(true);

        [...]
    }

    [...]
}

Si votre action étend AppCompatActivity

public class YourActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_xxx);

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

Plus rien à faire, voir l' action Ajouter

[FACULTATIF] Pour définir explicitement l'activité parent, modifiez votre Manifest.xml comme ceci:

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.YourActivity "
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

Voir Spécifier l'activité parent

tot
la source
1
C'est exactement ce que je cherchais. Tu as sauvé ma journée. Merci beaucoup.
Tashi Dendup
6

Si votre activité s'étend, AppCompatActivityvous devez remplacer la onSupportNavigateUp()méthode comme suit:

public class SecondActivity extends AppCompatActivity {

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_second);
       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);
       getSupportActionBar().setHomeButtonEnabled(true);
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       ...
   }

   @Override
   public void onBackPressed() {
       super.onBackPressed();
       this.finish();
   }

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

Gérez votre logique dans votre onBackPressed()méthode et appelez simplement cette méthode pour onSupportNavigateUp()que le bouton de retour du téléphone et la flèche de la barre d'outils fassent la même chose.

Ruzin
la source
6

tout d'abord dans onCreate Function, ajoutez la ligne suivante

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

puis ajoutez la fonction suivante dans le code:

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

        return super.onOptionsItemSelected(item);
    }
M Anees
la source
6

Vous devez d'abord écrire ces codes

@Override
    protected void onCreate(Bundle savedInstanceState) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

Puis ajoutez cette ligne dans le manifeste

 <activity android:name=".MainActivity"
            android:parentActivityName=".PreviousActivity"></activity>

Je pense que cela va fonctionner

Shahriar Ahmad
la source
5

Si vous utilisez la nouvelle bibliothèque de support pour 5.1 dans Android Studio, vous pouvez à la place l'utiliser sur votre AppCompatActivity

 ActionBar actionBar = getSupportActionBar();
 actionBar.setHomeButtonEnabled(true);
 actionBar.setDisplayHomeAsUpEnabled(true);
 actionBar.setHomeAsUpIndicator(R.mipmap.ic_arrow_back_white_24dp);
 actionBar.setDisplayShowHomeEnabled(true);

à votre santé.

ralphgabb
la source
5

Le moyen le plus simple et les meilleures pratiques comme l'explique google ici :

1.Ajoutez un parent pour votre enfantActivité dans le AndroidManifest.xml:

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

2.Activez le bouton de retour dans votre childActivity:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

A travaillé pour moi, j'espère que cela fonctionne pour vous aussi.

luke8800gts
la source
ceci n'est valable que si l'activité ne peut avoir qu'une seule activité parent. C'est le cas pour moi. +1
MQoder
L'étape 2 n'était pas requise dans mon cas.
Thomio
5

Après un temps de qualité que j'ai trouvé, l'option de thème est le principal problème dans mon code Et voici la bonne façon d'afficher la barre d'outils pour moi

Dans le fichier AndroidManifest, vous devez d'abord changer le style de votre thème

Theme.AppCompat.Light.DarkActionBar
to 
Theme.AppCompat.Light.NoActionBar

puis à votre activité xml, vous devez appeler votre propre barre d'outils comme

<androidx.appcompat.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        android:id="@+id/toolbar"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:elevation="4dp"/>

Et puis cette barre d'outils devrait être appelée dans votre fichier Java par

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

Et pour la barre d'outils montrant que U doit vérifier la valeur null pour éviter NullPointerException

if(getSupportActionBar() != null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Pour l'activité à domicile, ajoutez ceci

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

        return super.onOptionsItemSelected(item);
    }

OU pour votre activité souhaitée retour

public boolean onOptionsItemSelected(MenuItem item){
    Intent myIntent = new Intent(getApplicationContext(), YourActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}
MST
la source
3

J'ai vu tellement de réponses complexes, c'est donc mon code. Travaillé ici. Vous pouvez y parvenir de deux manières.

1) Compatibilité Android Stardard

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.core.app.NavUtils;

import android.view.MenuItem;
import android.view.View;

public class EditDiscoveryActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_discovery);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        /*toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });*/
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

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

}

2) Utilisez une icône personnalisée

Si vous souhaitez utiliser du code dans les commentaires, il vous suffit d'ajouter ce fichier dans drawable, appelé ic_arrow_white_24dp.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#ffffff"
        android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z"/>
    </vector>

Avec ce code.

toolbar.setNavigationIcon(R.drawable.ic_arrow_white_24dp);
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    finish();
                }
            });

J'espère que cela aidera certaines personnes ici!

Zhar
la source
2

Version allégée sans utilisation ActionBarActivityqui a toujours les mêmes comportements ici:

public class ToolbarConfigurer implements View.OnClickListener {
    private Activity activity;

    public ToolbarConfigurer(Activity activity, Toolbar toolbar, boolean displayHomeAsUpEnabled) {
        toolbar.setTitle((this.activity = activity).getTitle());
        if (!displayHomeAsUpEnabled) return;
        toolbar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);
        toolbar.setNavigationOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        NavUtils.navigateUpFromSameTask(activity);
    }
}

Utilisation: mettre new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true);en onCreate.

Mon Dieu
la source
Cela correspond au nouveau widget de la barre d'outils inclus dans la bibliothèque de support. Merci!!
Clocker
2

Vous devez ajouter le code mentionné ci-dessous dans le fichier manifeste. Recherchez l'activité à laquelle vous souhaitez ajouter la fonctionnalité de flèche de retour. Si vous trouvez celui-ci, bien ou créez l'activité

<activity android:name=".SearchActivity">

</activity>

Ajoutez ensuite les trois lignes de code suivantes entre les deux.

<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.raqib.instadate.MainActivity" />

Et n'oubliez pas d'ajouter ce morceau de code dans onCreate (); méthode de votre activité particulière dans laquelle vous avez besoin d'une flèche arrière.

        Toolbar toolbar = (Toolbar) findViewById(R.id.searchToolbar);
    setSupportActionBar(toolbar);
    try{
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }catch(NullPointerException e){
       Log.e("SearchActivity Toolbar", "You have got a NULL POINTER EXCEPTION");
    }

C'est ainsi que j'ai résolu le problème. Merci.

Muhammad Raqib
la source
2

Les autres réponses ne mentionnent pas que vous pouvez également définir ceci dans le XML de votre Toolbarwidget:

app:navigationIcon="?attr/homeAsUpIndicator"

Par exemple:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:background="?attr/colorPrimary"
    app:navigationIcon="?attr/homeAsUpIndicator"
    app:popupTheme="@style/AppTheme.PopupOverlay"
    app:title="@string/title_activity_acoustic_progress" />
Michael Litvin
la source
2

Tout ce que vous devez faire en 2020:
(sachant que vous voulez revenir à l'activité principale)

protected void onCreate(Bundle savedInstanceState){
    ...
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

public boolean onOptionsItemSelected(MenuItem item) {
    Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
    startActivityForResult(myIntent, 0);
    return true;
}
Ahmed Abdullah
la source
C'est intéressant, mais vous supposez que nous voulons revenir à MainActivity. Comment redirigeriez-vous vers une activité précédente?
mayid
1

Cela peut également être fait sans code en spécifiant une activité parente dans le manifeste de l'application. Si vous voulez un bouton de retour dans l'activité B qui passera à l'activité A, ajoutez simplement l'activité A en tant que parent de l'activité B dans le manifeste.

aby4reality
la source
1

Pour kotlin:

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        onBackPressed();
        return true;
    }
Raluca Lucaci
la source
1

J'avais besoin de mélanger certaines réponses pour obtenir la bonne réponse pour moi car mon application propose 3 activités qui peuvent aller et venir à tout moment. Activité1> Activité2> Activité3. Lorsque je faisais quelque chose sur mon activité3, le bouton Précédent revenait correctement à Activity2. Cependant, à partir de Activity2, en utilisant finish(), il était de retour à Activity3 et non à Activity1. Et j'étends AppCompatActivity. Donc, ma solution était:

public class Activity2 extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            ...

            getSupportActionBar().setHomeButtonEnabled(true);
        }
    }

sur AndroidManifest.xml:

<activity android:name=".activities.Activity2"
           android:parentActivityName="com.example.appname.activities.Activity1">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.example.appname.activities.Activity1" />
        </activity>

et enfin, le bouton d'action de mon menu (barre d'actions):

public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            ...

            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;

        }

        return super.onOptionsItemSelected(item);

    }

L'utilisation a NavUtils.navigateUpFromSameTask(this);fonctionné pour moi, au lieu de finish().

Gi Tavares
la source
1

Juste partager quelque chose qui m'a aidé et qui peut être utile pour les autres. Bien que la plupart des réponses ici soient correctes, en utilisant le getActionBar().setDisplayHomeAsUpEnabled(true);, cela ne fonctionnait pas pour moi. Le problème que j'ai eu était que j'essayais de créer une deuxième activité manuellement, mais il y a plus de détails impliqués.
Ce qui a vraiment résolu mon problème a été de suivre le tutoriel des développeurs Android ( https://developer.android.com/training/basics/firstapp/starting-activity ) pour créer une deuxième activité à l'aide des propres outils d'Android Studio:

Create the second activity
1. In the Project window, right-click the app folder and select New > Activity > Empty Activity.
2. In the Configure Activity window, enter "DisplayMessageActivity" for Activity Name and click Finish (leave all other properties set to the defaults).
Android Studio automatically does three things:
- Creates the DisplayMessageActivity file.
- Creates the corresponding activity_display_message.xml layout file.
- Adds the required <activity> element in AndroidManifest.xml.
ofri cofri
la source
0

Vous pouvez également simplement insérer onBackPressed()votre écouteur onClick. Cela amène votre bouton à agir comme les boutons "sauvegarde / remontée" par défaut dans les applications Android!

user3700215
la source
0
Toolbar toolbar=findViewById(R.id.toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

if (getSupportActionBar()==null){
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowHomeEnabled(true);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()==android.R.id.home)
    finish();
return super.onOptionsItemSelected(item);
}
Abhay Agrawal
la source
0

Cela fonctionne pour moi. Supposons qu'il y ait deux activités (Activityone, Activitytwo)

Inside Activitytwo utilise ce code

@Override
protected void onCreate(Bundle savedInstanceState) {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Sur Activityone

//when you need to go second activity
startActivity(new Intent(Activityone.this, Activitytwo.class));

Cela devrait être inclus dans la deuxième activité dans le fichier manifeste

<activity android:name=".Activitytwo"
        android:parentActivityName=".Activityone"></activity>

Et le résultat serait comme ça

entrez la description de l'image ici

Muhaiminur Rahman
la source
0
  protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YourxmlFileName);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }

  public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id==android.R.id.home) {
            finish();
            return true;
        }
        return false;
    }
S.Adikaram
la source