Afficher la flèche arrière dans la barre d'outils

496

Je migre de ActionBarvers Toolbardans ma candidature. Mais je ne sais pas comment afficher et définir l'événement de clic sur la flèche arrière Toolbarcomme je l'ai fait Actionbar.

entrez la description de l'image ici

Avec ActionBar, j'appelle mActionbar.setDisplayHomeAsUpEnabled(true). Mais il n'y a pas de méthode similaire comme celle-ci.

Quelqu'un a-t-il déjà fait face à cette situation et trouvé une manière de la résoudre?

Huy Duong Tu
la source

Réponses:

900

Si vous utilisez un, ActionBarActivityvous pouvez dire à Android d'utiliser Toolbarle ActionBarcomme suit:

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

Et puis appelle à

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

marchera. Vous pouvez également l'utiliser dans les fragments qui vous sont attachés, ActionBarActivitiesvous pouvez l'utiliser comme ceci:

((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
((ActionBarActivity) getActivity()).getSupportActionBar().setDisplayShowHomeEnabled(true);

Si vous n'utilisez pas ActionBarActivitiesou si vous souhaitez obtenir la flèche de retour sur un Toolbarqui n'est pas défini comme votre, SupportActionBarvous pouvez utiliser ce qui suit:

mActionBar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_action_back));
mActionBar.setNavigationOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
       //What to do on back clicked
   }
});

Si vous utilisez android.support.v7.widget.Toolbar, vous devez ajouter le code suivant à votre AppCompatActivity:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
MrEngineer13
la source
12
Repo officiel de l'icône de conception matérielle de googles github.com/google/material-design-icons/blob/master/navigation/…
MrEngineer13
70
Si vous utilisez la dernière version d'Appcompat-v7 (21.0.3 ou supérieure), vous pouvez utiliser R.drawable.abc_ic_ab_back_mtrl_am_alpha pour la flèche arrière dessinable, qui est incluse dans la bibliothèque de support.
Taeho Kim
23
Veuillez noter que getResources (). GetDrawable (...) est obsolète. Vous devez utiliser ContextCompat.getDrawable (context, ...) à la place.
Quentin S.
7
N'a pas fonctionné, ne trouve ni l'un ni l' R.drawable.abc_ic_ab_back_mtrl_am_alphaautre R.drawable.ic_action_back.
Henrique de Sousa
10
pour récupérer l'icône "retour" de la bibliothèque de support toolbar.setNavigationIcon(android.support.v7.appcompat.R.drawable.abc_ic_ab_back_material);
Bolein95
215

Je vois beaucoup de réponses mais voici la mienne qui n'est pas mentionnée auparavant. Cela fonctionne à partir d'API 8+.

public class DetailActivity extends AppCompatActivity

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

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

    // add back arrow to toolbar
    if (getSupportActionBar() != null){
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // handle arrow click here
    if (item.getItemId() == android.R.id.home) {
        finish(); // close this activity and return to preview activity (if there is any)
    }

    return super.onOptionsItemSelected(item);
}
Vasil Valchev
la source
3
Cela ne fonctionne que si vous définissez la barre d'outils comme barre d'action. Ce n'est pas pour les barres d'outils autonomes.
Kuffs
20
Upvote for onOptionItemSelected()This complète ce que MrEngineer13 n'a pas couvert dans sa réponse.
Atul
2
Merci, cela a fonctionné pour moi. Semble être meilleur que d'utiliser l'écouteur de clics, je ne me soucie pas vraiment des barres d'outils autonomes
Mike76
Comment puis-je changer la couleur de la flèche?
Dmitry
Je n'avais pas besoin des lignes sous la ligne de commentaire "barre d'outils", ça marche bien.
Hack06 du
173

Il existe de nombreuses façons d'y parvenir, voici ma préférée:

Disposition:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:navigationIcon="?attr/homeAsUpIndicator" />

Activité:

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

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // back button pressed
        }
    });
Igor Bubelov
la source
13
l'utilisation de l'attribut de thème est bien meilleure que la plupart des autres suggestions de cette question
Pedro Loureiro
3
au lieu d'utiliser, setNavigationOnClickListener()vous pouvez ajouter case android.R.id.home:à l'intérieur «onOptionsItemSelected ()».
eugene
1
case android.R.id.homen'a pas fonctionné pour moi. donc après une recherche pendant un certain temps, votre réponse a fait l'affaire .. merci.
deejay
C'est la solution la plus authentique, surtout si vous souhaitez utiliser l'icône de retour par défaut du système Android.
Nauman Aslam
using toolbar.setNavigationOnClickListener {onBackPressed ()}
filthy_wizard
74

vous pouvez utiliser la méthode setNavigationIcon de la barre d'outils. Android Doc

mToolBar.setNavigationIcon(R.drawable.abc_ic_ab_back_mtrl_am_alpha);

mToolBar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        handleOnBackPress();
    }
});
Sam
la source
1
Pourriez-vous ajouter quelques explications à votre réponse? Les réponses uniquement codées sont désapprouvées par SO.
klaxonner
1
Veuillez noter que la méthode setNavigationOnClickListener()a été ajoutée dans le niveau 21 et supérieur de l'
API
3
R.drawable.abc_ic_ab_back_mtrl_am_alpha est maintenant parti en support 23.2.0, utilisez plutôt la réponse acceptée.
Milan
25

Si vous ne voulez pas créer de personnalisé Toolbar, vous pouvez faire comme ça

public class GalleryActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...  
        getSupportActionBar().setTitle("Select Image");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

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

En toi AndroidManifest.xml

<activity
    android:name=".GalleryActivity"
    android:theme="@style/Theme.AppCompat.Light">        
</activity>

vous pouvez également le mettre android:theme="@style/Theme.AppCompat.Light"sur le <aplication>tag, pour l'appliquer à toutes les activités

entrez la description de l'image ici

Phan Van Linh
la source
2
Merci pourif (item.getItemId() == android.R.id.home)
Adizbek Ergashev
22
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    toolbar.setNavigationIcon(R.drawable.back_arrow); // your drawable
    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onBackPressed(); // Implemented by activity
        }
    });

Et pour API 21+ android:navigationIcon

<android.support.v7.widget.Toolbar
    android:navigationIcon="@drawable/back_arrow"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"/>
Ilya Gazman
la source
Doit être la réponse acceptée.
Anton Malyshev
17

J'ai utilisé cette méthode dans la documentation pour les développeurs Google :

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

Si vous obtenez une exception de pointeur nul, cela peut dépendre du thème. Essayez d'utiliser un thème différent dans le manifeste ou utilisez-le alternativement:

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

Puis dans le manifeste, où j'ai défini l'activité parent pour l'activité actuelle:

<activity
        android:name="com.example.myapp.MyCurrentActivity"
        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.myapp.MyMainActivity" />
</activity>

J'espère que cela t'aidera!

Paolo Anghileri
la source
1
Le lien google docs et le getSupportActionBar()travail. Merci!
Rick
15

Si vous étiez utilisez AppCompatActivityet vous êtes allé sur le chemin de ne pas l' utiliser, parce que vous vouliez pas obtenir le automatique ActionBarqu'il fournit, parce que vous voulez séparer le Toolbar, en raison de vos besoins de conception des matériaux et CoordinatorLayoutou AppBarLayout, alors, considérez ceci:

Vous pouvez toujours utiliser le AppCompatActivity, vous n'avez pas besoin d'arrêter de l'utiliser pour pouvoir utiliser un <android.support.v7.widget.Toolbar>dans votre xml. Désactivez simplement le style de barre d'action comme suit:

Tout d'abord, dérivez un style de l'un des thèmes NoActionBar que vous aimez dans votre styles.xml, j'ai utilisé Theme.AppCompat.Light.NoActionBarcomme ceci:

<style name="SuperCoolAppBarActivity" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/primary</item>

    <!-- colorPrimaryDark is used for the status bar -->
    <item name="colorPrimaryDark">@color/primary_dark</item>
    ...
    ...
</style>

Dans le manifeste de votre application, choisissez le thème de style enfant que vous venez de définir, comme suit:

    <activity
        android:name=".activity.YourSuperCoolActivity"
        android:label="@string/super_cool"
        android:theme="@style/SuperCoolAppBarActivity">
    </activity>

Dans votre Activity Xml, si la barre d'outils est définie comme suit:

...
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        />
...

Ensuite, et c'est la partie importante, vous définissez la barre d'actions de support sur l'AppCompatActivity que vous étendez, de sorte que la barre d'outils de votre XML devienne la barre d'actions. Je pense que c'est une meilleure façon, car vous pouvez simplement faire les nombreuses choses qu'ActionBar permet, comme les menus, le titre d'activité automatique, la gestion de la sélection des éléments, etc. sans recourir à l'ajout de gestionnaires de clics personnalisés, etc.

Dans la substitution onCreate de votre activité, procédez comme suit:

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

    setSupportActionBar(toolbar);
    //Your toolbar is now an action bar and you can use it like you always do, for example:
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} 
Dhiraj Gupta
la source
8
MyActivity extends AppCompatActivity {

    private Toolbar toolbar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        toolbar = (Toolbar) findViewById(R.id.my_toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationOnClickListener(arrow -> onBackPressed());
    }
Artemiy
la source
Vous pouvez utiliser retrolambda.
Artemiy
c'est ce que j'ai et ça ne fonctionne pas. ne peux pas le comprendre.
filthy_wizard
7

Un moyen simple et facile d'afficher le bouton de retour sur la barre d'outils

Collez ce code dans la méthode onCreate

 if (getSupportActionBar() != null){

            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }

Collez cette méthode de remplacement en dehors de la méthode onCreate

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

        finish();
    }
    return super.onOptionsItemSelected(item);
}
Waheed Sabir
la source
7

A Kotlin, ce serait

private fun setupToolbar(){
    toolbar.title = getString(R.string.YOUR_TITLE)
    setSupportActionBar(toolbar)
    supportActionBar?.setDisplayHomeAsUpEnabled(true)
    supportActionBar?.setDisplayShowHomeEnabled(true)
}

// don't forget click listener for back button
override fun onSupportNavigateUp(): Boolean {
    onBackPressed()
    return true
}
gprathour
la source
6

Vous pouvez facilement le faire.

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

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

Crédits: https://freakycoder.com/android-notes-24-how-to-add-back-button-at-toolbar-941e6577418e

Euler Tiago
la source
5

Dans le AppCompatActivitypar exemple, vous pouvez faire

public class GrandStatActivity extends AppCompatActivity {

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

    @Override
    public void onResume() {
        super.onResume();

        // Display custom title
        ActionBar actionBar = this.getSupportActionBar();
        actionBar.setTitle(R.string.fragment_title_grandstats);

        // Display the back arrow
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
    }

    // Back arrow click event to go to the parent Activity
    @Override
    public boolean onSupportNavigateUp() {
        onBackPressed();
        return true;
    }

}
Développeur
la source
4

Dans votre fichier manifeste pour l'activité où vous souhaitez ajouter un bouton de retour, nous utiliserons la propriété android: parentActivityName

        <activity
        android:name=".WebActivity"
        android:screenOrientation="portrait"
        android:parentActivityName=".MainActivity"
        />

PS Cet attribut a été introduit dans l'API niveau 16.

Sunny Kumar Aditya
la source
3

Cela a parfaitement fonctionné

public class BackButton extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chat_box);
        Toolbar chatbox_toolbar=(Toolbar)findViewById(R.id.chat_box_toolbar);
        chatbox_toolbar.setTitle("Demo Back Button");
        chatbox_toolbar.setTitleTextColor(getResources().getColor(R.color.white));
        setSupportActionBar(chatbox_toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        chatbox_toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Define Back Button Function
            }
        });
    }
}
Vikash Sharma
la source
3

Tout d'abord, vous devez initialiser la barre d'outils:

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

puis appelez le bouton de retour dans la barre d'actions:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
Anubhav
la source
2

Si vous souhaitez obtenir la flèche de retour sur une barre d'outils qui n'est pas définie en tant que SupportActionBar:

(kotlin)

val resId = getResIdFromAttribute(toolbar.context, android.R.attr.homeAsUpIndicator)
toolbarFilter.navigationIcon = ContextCompat.getDrawable(toolbar.context, resId)
toolbarFilter.setNavigationOnClickListener { fragmentManager?.popBackStack() }

pour obtenir des res à partir des attributs:

@AnyRes
fun getResIdFromAttribute(context: Context, @AttrRes attr: Int): Int {
    if (attr == 0) return 0
    val typedValueAttr = TypedValue()
    context.theme.resolveAttribute(attr, typedValueAttr, true)
    return typedValueAttr.resourceId
}
John
la source
1

Ajoutez ceci au xml de l'activité dans le dossier de disposition:

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">
    <android.support.v7.widget.Toolbar
        android:id="@+id/prod_toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />
</android.support.design.widget.AppBarLayout>

Rendez la barre d'outils cliquable, ajoutez-les à la méthode onCreate:

Toolbar toolbar = (Toolbar) findViewById(R.id.prod_toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        finish();
    }
});
Yang
la source
1

Peut-être un moyen plus fiable d'obtenir l'icône en haut de votre thème (si vous n'utilisez pas la barre d'outils comme barre d'action):

toolbar.navigationIcon = context.getDrawableFromAttribute(R.attr.homeAsUpIndicator)

Afin de transformer l'attribut de thème en un dessinable, j'ai utilisé une fonction d'extension:

fun Context.getDrawableFromAttribute(attributeId: Int): Drawable {
    val typedValue = TypedValue().also { theme.resolveAttribute(attributeId, it, true) }
    return resources.getDrawable(typedValue.resourceId, theme)
}
danwilkie
la source
0

Si vous utilisez DrawerLayout avec ActionBarDrawerToggle , puis pour afficher le bouton Retour au lieu du bouton Menu (et vice versa), vous devez ajouter ce code dans votre activité:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // ...

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.application_name, R.string.application_name);
    mDrawerLayout.addDrawerListener(mDrawerToggle);

    mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_arrow_back_white_32dp);
    mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            onBackPressed(); // Or you can perform some other action here when Back button is clicked.
        }
    });
    mDrawerToggle.syncState();
    // ...
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (mDrawerToggle.onOptionsItemSelected(item))
        return true;

    switch (item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        // ...
    }

    return super.onOptionsItemSelected(item);
}

public void showBackInToolbar(boolean isBack) {
    // Remove next line if you still want to be able to swipe to show drawer menu.
    mDrawerLayout.setDrawerLockMode(isBack ? DrawerLayout.LOCK_MODE_LOCKED_CLOSED : DrawerLayout.LOCK_MODE_UNLOCKED);
    mDrawerToggle.setDrawerIndicatorEnabled(!isBack);
    mDrawerToggle.syncState();
}

Ainsi, lorsque vous devez afficher le bouton Retour au lieu du bouton Menu , appelez showBackInToolbar (true) et si vous avez besoin du bouton Menu , appelez showBackInToolbar (false) .

Vous pouvez générer une flèche de retour (ic_arrow_back_white_32dp) ici , recherchez arrow_back dans la section Clipart (utilisez 32dp par défaut avec un remplissage de 8dp). Sélectionnez simplement la couleur souhaitée.

Borzh
la source
0

Vous pouvez toujours ajouter un Relative layoutou un Linear Layoutdans votre Toolbaret placer une vue Image pour l'icône de retour ou fermer l'icône n'importe où dans la barre d'outils comme vous le souhaitez

Par exemple, j'ai utilisé la disposition relative dans ma barre d'outils

 <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar_top"
                android:layout_width="match_parent"
                android:layout_height="35dp"
                android:minHeight="?attr/actionBarSize"
                android:nextFocusDown="@id/netflixVideoGridView"
                app:layout_collapseMode="pin">

                <RelativeLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content">


                    <TextView

                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="Myflix"
                        android:textAllCaps="true"
                        android:textSize="19sp"
                        android:textColor="@color/red"
                        android:textStyle="bold" />


                    <ImageView
                        android:id="@+id/closeMyFlix"
                        android:layout_alignParentRight="true"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical"
                        app:srcCompat="@drawable/vector_close" />


                </RelativeLayout>

            </android.support.v7.widget.Toolbar>

Et cela ressemble à ceci:

entrez la description de l'image ici

Vous pouvez ajouter un écouteur de clics sur cette vue d'image à partir d'une activité ou d'un fragment comme celui-ci.

  closeMyFlix.setOnClickListener({
            Navigator.instance.showFireTV(  activity!!.supportFragmentManager)
        })
Hitesh Sahu
la source
0

Avec Kotlin c'est devenu:

Xml:

<include
android:id="@+id/tbSignToolbar "
layout="@layout/toolbar_sign_up_in"/>

Dans votre activité: -

setSupportActionBar(tbSignToolbar as Toolbar?)//tbSignToolbar :id of your toolbar 
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
wissem miled
la source
0

Si vous utilisez la navigation JetPack.

Voici la disposition de MainActivity

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
                                               xmlns:app="http://schemas.android.com/apk/res-auto"
                                               xmlns:tools="http://schemas.android.com/tools"
                                               android:layout_width="match_parent"
                                               android:layout_height="match_parent"
                                               tools:context=".MainActivity">

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

</androidx.appcompat.widget.Toolbar>

<fragment
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintTop_toBottomOf="@id/toolBar"
        app:layout_constraintBottom_toTopOf="parent"
        app:navGraph="@navigation/nav_graph"/>

Configurez votre barre d'outils dans votre activité comme ci-dessous dans onCreate () de votre classe d'activité.

val navHostFragment = supportFragmentManager
        .findFragmentById(R.id.my_nav_host_fragment) as NavHostFragment? ?: return

val navController = navHostFragment.findNavController()
val toolBar = findViewById<Toolbar>(R.id.toolBar)
setSupportActionBar(toolBar) // To set toolBar as ActionBar
setupActionBarWithNavController(navController)

setupActionBarWithNavController (navController) Crée un bouton de retour sur la barre d'outils si nécessaire et gère la fonctionnalité backButton. Si vous devez écrire une fonctionnalité CustomBack, créez un callBack comme ci-dessous sur votre méthode fragment onCreate ()

val callback = requireActivity().onBackPressedDispatcher.addCallback(this) {
        // Handle the back button event
    }

De la documentation: https://developer.android.com/guide/navigation/navigation-custom-back

Prakash
la source
0

Si vous utilisez la androidx.appcompat.app.AppCompatActivityseule utilisation:

Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Définissez ensuite simplement dans l' Manifest.xmlactivité parent.

<activity
    android:name=".MyActivity"
    ...>
  <meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value=".ParentActivity" />
</activity>

Au lieu de cela, si vous utilisez un Toolbaret que vous souhaitez un comportement personnalisé, utilisez simplement:

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar" 
    app:navigationIcon="?attr/homeAsUpIndicator"
    .../>

et dans votre activité:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //....
    }
});
Gabriele Mariotti
la source