web-dev-qa-db-fra.com

Android - Bouton Précédent dans la barre de titre

Dans de nombreuses applications (Agenda, 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 Précédent, mais l'application que je crée ne le fait pas. Comment faire pour que cette icône vous ramène à l'écran précédent?

89
Drew

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

Tout d’abord, activez l’icône de l’application en utilisant le code suivant dans l’activité dont vous voulez insérer le bouton Précédent dans la barre de titre:

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

Une fois que vous avez ajouté le code ci-dessus, une flèche arrière apparaît à gauche de l'icône de l'application.

enter image description here

Deuxièmement, une fois que vous avez effectué ce qui précède, vous devez toujours créer un code qui tirera parti de l'événement click. Pour ce faire, sachez que lorsque vous cliquez sur l'icône de l'application, une méthode onOptionsItemSelected est appelée. Donc, pour revenir à l'activité précédente, ajoutez cette méthode à votre activité et mettez-y le code Intent qui vous ramènera à l'activité précédente. Par exemple, supposons que l'activité que vous essayez de retourner à s'appelle 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 ça!

(Dans l'API de développeurs Android, il est recommandé de manipuler 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 ton activité

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
126
Luke F.

utiliser ce code

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

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

  int id = item.getItemId();

     if (id==Android.R.id.home) {
        finish();
    }
53
anupam sharma

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;
}
35
Lucy Fair

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 onOptionsItemSelected et utilisez la méthode statique NavUtils.navigateUpFromSameTask () pour naviguer et jeter 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 browseUpFromSameTask () ne convient que lorsque votre application est propriétaire de la tâche en cours (c'est-à-dire que l'utilisateur a démarré 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 appartenant à une application différente, la navigation vers le haut doit créer une nouvelle tâche appartenant à votre application, ce qui nécessite la création d'une nouvelle pile d'arrière-plan.

16
spacebiker

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 prolonge AppCompatActivity

public class YourActivity extends AppCompatActivity {

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

            getSupportActionBar().setHomeButtonEnabled(true);

            [...]
        }

        [...]
    }

Rien à faire , voir action d'ajout

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

<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écifiez l'activité parent

9
tot

tout d'abord dans onCreate Function ajouter 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);
    }
5
M Anees

La manière la plus simple et la meilleure pratique, comme l'explique google ici :

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

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

2.Activez le bouton retour dans votre enfantActivité:

myActionOrActionSupportBar.setDisplayHomeAsUpEnabled(true);

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

5
luke8800gts

Si vous utilisez la nouvelle bibliothèque de support pour la version 5.1 dans Android studio, vous pouvez plutôt 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é.

4
ralphgabb

Vous devez d’abord écrire ces codes

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

Ajoutez ensuite cette ligne dans le manifeste

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

Je pense que cela va fonctionner

3
Shahriar Ahmad

Si votre activité s'étend AppCompatActivity, vous devez remplacer la méthode onSupportNavigateUp() de la manière suivante:

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 méthode onBackPressed() et appelez-la simplement dans onSupportNavigateUp() pour que le bouton Précédent du téléphone et la flèche de la barre d'outils fassent de même.

3
Ruzin

Version légère sans utiliser ActionBarActivity qui 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: Mettez new ToolbarConfigurer(this, (Toolbar) findViewById(R.id.my_awesome_toolbar), true); dans onCreate.

2
Mygod

Vous devez ajouter le code mentionné ci-dessous dans le fichier manifeste. Recherchez l'activité dans laquelle vous souhaitez ajouter la fonctionnalité de flèche arrière. Si vous trouvez celui-ci alors 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 de la 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");
    }

Voici comment j'ai résolu le problème. Merci.

1
RaQib

J'avais besoin de mélanger quelques réponses pour obtenir la bonne réponse car mon application propose trois activités pouvant aller et retour à tout moment. Activité1> Activité2> Activité3. Lorsque je faisais quelque chose sur mon activité3, le bouton Précédent était correctement sauvegardé sur Activité2. Cependant, à partir de l’Activité2, à l’aide de finish(), il s’appuyait sur Activité3 et non sur Activité1. 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'action):

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

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

        }

        return super.onOptionsItemSelected(item);

    }

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

1
Gi Tavares

Si vous utilisez un ActionBar, vous souhaiterez lire cette documentation http://developer.Android.com/reference/Android/app/ActionBar.html#setDisplayHomeAsUpEnabled (boolean)

Ensuite, vous devez écraser la méthode onOptionsItemSelected (MenuItem) et rechercher l'événement Android.R.id.home à entrer. Ensuite, vous savez que l'utilisateur a cliqué sur ce bouton de retour dans la barre d'actions.

1
Paul Thompson
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);
}
0
Abhay Agrawal

Vous pouvez aussi simplement mettre onBackPressed() dans votre écouteur onClick. Cela fait en sorte que votre bouton se comporte comme les boutons par défaut "back/up" dans Android apps!

0
user3700215

Vous pouvez également le faire sans code en spécifiant une activité parent dans le manifeste de l'application. Si vous souhaitez un bouton de retour dans l'activité B pour accéder à l'activité A, ajoutez simplement l'activité A en tant que parent de l'activité B dans le manifeste.

0
aby4reality

Les autres réponses ne précisent pas que vous pouvez également définir cela dans le code XML de votre widget Toolbar:

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" />
0
Michael Litvin

Partager juste quelque chose qui m'a aidé et peut être utile pour d'autres. Bien que la plupart des réponses ici soient correctes, en utilisant la getActionBar().setDisplayHomeAsUpEnabled(true);, cela ne fonctionnait pas pour moi. Le problème que j’ai eu, c’est que j’essayais de créer une deuxième activité manuellement, mais il ya plus de détails.
Ce qui a vraiment résolu mon problème était de suivre Android Tutoriel pour développeurs ( https://developer.Android.com/training/basics/firstapp/starting-activity ) pour créer une deuxième activité à l'aide de Android propres outils de 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.
0
ofri cofri

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

Inside Activitytwo utiliser ce code

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

On Activityone

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

Ceci devrait être inclus dans la deuxième activité du fichier manifeste

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

Et le résultat serait comme ceci

enter image description here

0
Muhaiminur Rahman

Pour le kotlin:

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