Afficher le bouton de retour sur la barre d'action


181

J'essaye d'afficher un Back buttonsur la Action barpour déplacer la page / activité précédente ou vers la page principale (première ouverture). Et je ne peux pas le faire.

mon code.

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

le code est entré onCreate.


19
Utilisez: getSupportActionBar (). SetDisplayHomeAsUpEnabled (true);
Sukitha Udugamasooriya

@SukithaUdugamasooriya Merci beaucoup
Sardorbek Rkh

Réponses:


207

Eh bien, c'est simple à afficher le bouton de retour

actionBar.setDisplayHomeAsUpEnabled(true);

et vous pouvez ensuite personnaliser l'événement de retour sur onOptionsItemSelected

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

J'ai ajouté les lignes ci-dessus à l'intérieur du onOptionsItemSelected (élément MenuItem), car j'ai déjà un menu sur l'action mauvaise liste des identifiants pour rediriger les options de menu, l'identifiant de la maison ne fonctionne pas lorsque vous cliquez dessus

Si vous rencontrez un comportement étrange (comme dans: vous utilisez le bouton de retour (R.id.home) d'un fragment et finissez par fermer l'activité), assurez-vous que vous n'avez PAS défini "android: noHistory" sur cette activité, car si vous faites, même revenir d'un fragment à la «vue d'ensemble» de l'activité la terminera.
Igor

2
Assurez-vous de définir l'activité parent dans AndroidMenifest.xml pour que le bouton R.id.home fonctionne.
Leap Hawk

192

Je pense que onSupportNavigateUp()c'est la meilleure et la plus simple façon de le faire, vérifiez les étapes ci-dessous. L'étape 1 est nécessaire, la deuxième étape a une alternative.

Étape 1 montrant le bouton de retour: ajoutez cette ligne dans la onCreate()méthode pour afficher le bouton de retour.

assert getSupportActionBar() != null;   //null check
getSupportActionBar().setDisplayHomeAsUpEnabled(true);   //show back button

Étape 2 Mise en œuvre du clic arrière: remplacer cette méthode

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

c'est terminé
OU Étape 2 Alternative: vous pouvez ajouter des méta à l'activité dans le fichier manifeste comme

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

Modifier: si vous n'utilisez pas d' AppCompatactivité, n'utilisez pas de supportmot, vous pouvez utiliser

getActionBar().setDisplayHomeAsUpEnabled(true); // In `OnCreate();`

// And override this method
@Override 
public boolean onNavigateUp(){ 
     finish(); 
     return true; 
}

Merci à @atariguy pour ses commentaires.


2
Cette solution fonctionne très bien lorsque vous avez besoin de renvoyer des données à l'activité parent ou si vous souhaitez conserver les valeurs d'EditText dans l'activité parent. J'ai essayé des onOptionsItemSelectedsolutions mais je n'ai pas réussi à le faire.
weeix

3
Meilleure solution +10.
Satheeshwaran

3
Si vous n'utilisez pas la bibliothèque de support pour l'Actionbar, modifiez comme suit: getActionBar().setDisplayHomeAsUpEnabled(true); @Override public boolean onNavigateUp(){ finish(); return true; }
atariguy

1
Phénoménal. +1. Facile. Élégant. Belle. :)
Rohit Kumar

1
Merci de votre aide. En utilisant le manifeste, cela ne fonctionnait pas mais en utilisant le code, il fonctionne
santosh devnath

70

La magie opère onOptionsItemSelected.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            // app icon in action bar clicked; go home
            Intent intent = new Intent(this, HomeActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

1
Dans mon cas, je veux ajouter un bouton de retour dans cette page où l'événement onOptionsItemSelected (élément MenuItem) ne sera pas là ... Y a-t-il une autre solution pour cela ??
Vidhi

1
Vous devez d'abord ajouter getActionBar().setDisplayHomeAsUpEnabled(true);votre onCreateMethod pour le bouton de retour
aletede91

1
Je pense que si vous faites de cette façon, vous ne revenez pas en arrière même si vous recommencez l'activité précédente en ayant maintenant un instant de plus et vous avancez toujours jusqu'à ce que le débordement de pile se produise si vous continuez assez longtemps. Je pense que la réponse d'Igor est correcte, vous devriez arrêter cette activité avec finish () et laisser le framework vous ramener à l'instance d'activité précédente en cours d'exécution.
Reijo Korhonen

2
utilisez la this.onBackPressed();méthode lorsque l'utilisateur clique sur le bouton de retour.
CaptRisky

47

Solution officielle

Ajoutez ces deux extraits de code à votre SubActivity

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

@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);
}

ajoutez des méta-données et parentActivity au manifeste pour prendre en charge le sdk inférieur.

 <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.SubActivity"
        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>

Référence ici: http://developer.android.com/training/implementing-navigation/ancestral.html


5
Remarque: si vous utilisez des bibliothèques de support pour la compatibilité ascendante, vous devrez utiliser "getSupportActionBar ()" au lieu de "getActionBar ()". C'est la réponse la plus complète et la plus officielle.
Christopher Bull le

32

Ajoutez ces lignes à onCreate ()

android.support.v7.app.ActionBar actionBar = getSupportActionBar();
   actionBar.setHomeButtonEnabled(true);
   actionBar.setDisplayHomeAsUpEnabled(true);

et dans onOptionItemSelected

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                //Write your logic here
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

J'espère que ceci vous aidera..!


27

Essayez ce code, ne le considérez que si vous avez besoin du bouton de retour.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //YOUR CODE
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    //YOUR CODE
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

17

Sur votre onCreateméthode, ajoutez:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Lors de la définition dans l' AndroidManifest.xmlactivité parent (l'activité qui sera appelée une fois que le bouton retour dans la barre d'action est enfoncé):

Dans votre <activity>définition sur le manifeste, ajoutez la ligne:

android:parentActivityName="com.example.activities.MyParentActivity"

Vous devez uniquement insérer le code du manifeste si vous souhaitez prendre en charge les appareils antérieurs à la version 4.0. Le premier bit de code est cependant une meilleure solution pour les bibliothèques actuelles.
Louie Bertoncin

8

Je sais que je suis un peu en retard, mais j'ai pu résoudre ce problème en suivant directement la documentation .

Ajouter la balise de méta-données à AndroidManifest.xml(pour que le système sache)

 <activity
        android:name=".Sub"
        android:label="Sub-Activity"
        android:parentActivityName=".MainChooser"
        android:theme="@style/AppTheme.NoActionBar">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainChooser" />
    </activity>

Ensuite, activez le bouton de retour (haut) dans votre MainActivity

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_child);
 
    // my_child_toolbar is defined in the layout file 
    Toolbar myChildToolbar =
        (Toolbar) findViewById(R.id.my_child_toolbar);
    setSupportActionBar(myChildToolbar);
 
    // Get a support ActionBar corresponding to this toolbar 
    ActionBar ab = getSupportActionBar();
 
    // Enable the Up button 
    ab.setDisplayHomeAsUpEnabled(true);
    } 

Et vous serez tous prêts!

Source: documentation du développeur Android


6

Je sais que ce qui précède sont de nombreuses solutions utiles, mais cette fois, j'ai lu cet article (Android Studio 2.1.2 actuel avec SDK 23), une méthode ci-dessus ne fonctionne pas.

Voici ma solution pour la sous-activité est MapsActivity

Tout d'abord, vous devez ajouter parentActivity dans

AndroidManifest.xml

comme ça :

<application ... >
    ...
    <!-- Main activity (which has no parent activity) -->
    <activity
        android:name="com.example.myapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        .....
        android:parentActivityName=".MainActivity" >
        <!-- Support Parent activity for Android 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myapp.MainActivity" />
    </activity>
</application>

Deuxièmement, assurez-vous que votre sous-activité s'étend AppCompatActivity, et non FragmentActivity.

Troisièmement, onOptionsItemSelected()méthode de remplacement

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon action bar is clicked; go to parent activity
                this.finish();
                return true;
            case R.id.action_settings:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

J'espère que cela aidera!


4

Essayez ceci, dans votre onCreate ()

 getActionBar().setHomeButtonEnabled(true);
 getActionBar().setDisplayHomeAsUpEnabled(true);

Et pour clickevent,

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                // app icon in action bar clicked; goto parent activity.
                this.finish();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

4

Pour y parvenir, il y a simplement deux étapes,

Étape 1: Accédez à AndroidManifest.xmlet ajoutez ce paramètre dans la <activity>balise -android:parentActivityName=".home.HomeActivity"

Exemple:

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

Étape 2: ActivityDetailAjoutez votre actionpour 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);
}

4

dans la méthode onCreate write-

Toolbar toolbar = findViewById(R.id.tool);
    setSupportActionBar(toolbar);
    if (getSupportActionBar() != null) {
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
@Override
public void onBackPressed() {
    super.onBackPressed();
    startActivity(new Intent(ActivityOne.this, ActivityTwo.class));
    finish();
}

et c'est le fichier xml-

<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark"
android:id="@+id/tool">

et dans styles.xml, changez-le en

Theme.AppCompat.Light.NoActionBar

c'est tout ce que nous devons faire.


4

Ceci est simple et fonctionne très bien pour moi

ajoutez ceci dans la méthode onCreate ()

getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

ajouter cette méthode oncreate () extérieure

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

3

Dans votre onCreate()méthode, ajoutez cette ligne

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

et, dans la même activité, ajoutez cette méthode pour gérer le clic sur le bouton

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

2

J'ai résolu de cette façon

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

@Override
public void onBackPressed(){
    Intent backMainTest = new Intent(this,MainTest.class);
    startActivity(backMainTest);
    finish();
}

1

mon code de travail pour revenir à l'écran.

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {

    case android.R.id.home:

        Toast.makeText(getApplicationContext(), "Home Clicked",
                Toast.LENGTH_LONG).show();

        // go to previous activity
        onBackPressed();

        return true;

    }

    return super.onOptionsItemSelected(item);
}

1
 public void initToolbar(){
       //this set back button 
       getSupportActionBar().setDisplayHomeAsUpEnabled(true);
       //this is set custom image to back button
       getSupportActionBar().setHomeAsUpIndicator(R.drawable.back_btn_image);
}


//this method call when you press back button
@Override
public boolean onSupportNavigateUp(){
    finish();
    return true;
}

1
ActionBar actionBar=getActionBar();

actionBar.setDisplayHomeAsUpEnabled(true);

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

    return super.onOptionsItemSelected(item);
}

1

Il est peut-être trop tard pour répondre mais j'ai une solution plus courte et plus fonctionnelle à mon avis.

// Inside your onCreate method, add these.
ActionBar actionBar = getSupportActionBar();
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);

// After the method's closing bracket, add the following method exactly as it is and voiulla, a fully functional back arrow appears at the action bar
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    onBackPressed();
    return true;
}

1

Dans oncreate (); écrivez cette ligne->

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

puis implémentez la méthode ci-dessous dans cette classe

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case android.R.id.home:
        // app icon in action bar clicked; go home
      onBackPressed();
        return true;
    default:
        return super.onOptionsItemSelected(item);
    }
}

1

Manifest.xml

<activity
            android:name=".Activity.SecondActivity"
            android:label="Second Activity"
            android:parentActivityName=".Activity.MainActivity"
            android:screenOrientation="portrait"></activity>

1

Afin d'afficher le bouton de retour de la barre d'action dans Kotlin, il existe 2 façons de l'implémenter

1. à l'aide de la barre d'action par défaut fournie par Android - Votre activité doit utiliser un thème doté d'une barre d'action - par exemple: Theme.AppCompat.Light.DarkActionBar

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    val actionBar = supportActionBar
    actionBar!!.title = "your title"
    actionBar.setDisplayHomeAsUpEnabled(true)
    //actionBar.setDisplayHomeAsUpEnabled(true)
}

override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}

2. Créez votre propre barre d'action - désactivez la barre d'action par défaut - par exemple: Theme.AppCompat.Light.NoActionBar - ajoutez une mise en page à votre activity.xml

    <androidx.appcompat.widget.Toolbar
     android:id="@+id/main_toolbar"
     android:layout_width="match_parent"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent">

     <androidx.constraintlayout.widget.ConstraintLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:layout_editor_absoluteX="16dp">

         <TextView
             android:id="@+id/main_toolbar_title"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:text="Your Title"
             android:textSize="25sp"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
             app:layout_constraintHorizontal_bias="0.5"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />

     </androidx.constraintlayout.widget.ConstraintLayout>
 </androidx.appcompat.widget.Toolbar>
  • onCreate
override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)

     setSupportActionBar(findViewById(R.id.main_toolbar))
 }
  • créez votre propre bouton
<?xml version="1.0" encoding="utf-8"?>
<menu
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto" >

 <item
     android:id="@+id/main_action_toolbar"
     android:icon="@drawable/ic_main_toolbar_item"
     android:title="find"
     android:layout_width="80dp"
     android:layout_height="35dp"
     app:actionLayout="@layout/toolbar_item"
     app:showAsAction="always"/>

</menu>
  • dans YourActivity.kt
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
     menuInflater.inflate(R.menu.main_toolbar_item, menu)

     leftToolbarItems = menu!!.findItem(R.id.main_action_toolbar)
     val actionView = leftToolbarItems.actionView
     val badgeTextView = actionView.findViewById<TextView>(R.id.main_action_toolbar_badge)
     badgeTextView.visibility = View.GONE

     actionView.setOnClickListener {
         println("click on tool bar")
     }
     return super.onCreateOptionsMenu(menu)
 }

0

Ajoutez le code ci-dessous dans la fonction onCreate:

getSupportActionBar (). setDisplayHomeAsUpEnabled (true);

Et puis surcharger: @Override public boolean onOptionsItemSelected (élément MenuItem) {onBackPressed (); retourne vrai; }


0

Dans la version mise à jour, getActionBar () ne fonctionne pas!

Au lieu de cela, vous pouvez le faire de cette manière

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

ajouter le bouton de retour dans la barre de titre Android cela vous aide en 2020


Vos deux dernières réponses renvoient toutes les deux au même site. Êtes-vous associé / affilié à ce site de quelque manière que ce soit? Si vous êtes affilié, vous devez divulguer cette affiliation dans le message . Si vous ne divulguez pas votre affiliation, elle est considérée comme du spam. Voir: Que signifie une «bonne» auto-promotion? , quelques trucs et conseils sur l'auto-promotion , Quelle est la définition exacte du «spam» pour Stack Overflow? , et Qu'est - ce qui fait du spam .
Makyen
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.