Mostrar la flecha hacia atrás en la barra de herramientas

496

Estoy migrando de ActionBara Toolbaren mi aplicación. Pero no sé cómo mostrar y configurar el evento de clic en Flecha hacia atrás Toolbarcomo lo hice en Actionbar.

ingrese la descripción de la imagen aquí

Con ActionBar, llamo mActionbar.setDisplayHomeAsUpEnabled(true). Pero no existe un método similar como este.

¿Alguien ha enfrentado alguna vez esta situación y de alguna manera ha encontrado una manera de resolverla?

Huy Duong Tu
fuente

Respuestas:

900

Si está utilizando un, ActionBarActivityentonces puede decirle a Android que lo use de Toolbarla ActionBarmisma manera:

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

Y luego llama a

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

trabajará. También puede usar eso en Fragmentos que están unidos a ActionBarActivitiesusted, puede usarlo así:

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

Si no está utilizando ActionBarActivitieso si desea obtener la flecha hacia atrás en una Toolbarque no está configurada como SupportActionBarsuya, puede usar lo siguiente:

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 está utilizando android.support.v7.widget.Toolbar, entonces debe agregar el siguiente código a su AppCompatActivity:

@Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}
MrEngineer13
fuente
12
Icono oficial de Google
MrEngineer13
70
Si está utilizando la última versión de appcompat-v7 (21.0.3 o superior), puede usar R.drawable.abc_ic_ab_back_mtrl_am_alpha para dibujar la flecha hacia atrás, que se incluye en la biblioteca de soporte.
Taeho Kim
23
Tenga en cuenta que getResources (). GetDrawable (...) está en desuso. Debería usar ContextCompat.getDrawable (contexto, ...) en su lugar.
Quentin S.
77
No funcionó, tampoco puede encontrar R.drawable.abc_ic_ab_back_mtrl_am_alphaninguno R.drawable.ic_action_back.
Henrique de Sousa
10
obtener el icono "volver" de la biblioteca de soporte toolbar.setNavigationIcon(android.support.v7.appcompat.R.drawable.abc_ic_ab_back_material);
Bolein95
215

Veo muchas respuestas, pero aquí está la mía, que no se menciona antes. Funciona desde 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
fuente
3
Esto solo funciona si configura la barra de herramientas como la barra de acciones. No es para barras de herramientas independientes.
Kuffs
20
Votación a favor de onOptionItemSelected()Esto completa lo que MrEngineer13 no ha cubierto en su respuesta.
Atul
2
Gracias, esto funcionó para mí. Parece ser mejor que usar un escucha de clics, realmente no me importan las barras de herramientas independientes
Mike76
¿Cómo puedo cambiar el color de la flecha?
Dmitry
No necesitaba las líneas debajo de la línea de comentarios "barra de herramientas", funciona bien.
Hack06
173

Hay muchas formas de lograrlo, aquí está mi favorito:

Diseño:

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

Actividad:

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

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // back button pressed
        }
    });
Igor Bubelov
fuente
13
usar el atributo del tema es mucho mejor que la mayoría de las otras sugerencias en esta pregunta
Pedro Loureiro
3
en lugar de usar setNavigationOnClickListener(), puede agregar case android.R.id.home:dentro de 'onOptionsItemSelected ()'.
eugene
1
case android.R.id.homeNo funcionó para mí. así que después de buscar por un tiempo, su respuesta funcionó ... gracias.
deejay
Esta es la solución más auténtica, especialmente si desea utilizar el icono de retroceso predeterminado del sistema Android.
Nauman Aslam
mediante toolbar.setNavigationOnClickListener {onBackPressed ()}
filthy_wizard
74

puede usar el método setNavigationIcon de la barra de herramientas. 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
fuente
1
¿Podría por favor agregar alguna explicación a su respuesta? Las respuestas de solo código están mal vistas en SO.
tocar la bocina el
1
Tenga en cuenta que el método setNavigationOnClickListener()se ha agregado en el nivel 21 de la API y superiores
Ali Mehrpour
3
R.drawable.abc_ic_ab_back_mtrl_am_alpha ya no se encuentra en el soporte 23.2.0, utilice la respuesta aceptada en su lugar.
Milán
25

Si no desea crear una personalizada Toolbar, puede hacer esto

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 ti AndroidManifest.xml

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

También puede poner esto android:theme="@style/Theme.AppCompat.Light"en la <aplication>etiqueta, para aplicar a todas las actividades

ingrese la descripción de la imagen aquí

Phan Van Linh
fuente
2
Gracias porif (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
        }
    });

Y para 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
fuente
Debería ser la respuesta aceptada.
Anton Malyshev
17

Utilicé este método de la documentación para desarrolladores de Google :

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

Si obtiene una excepción de puntero nulo, podría depender del tema. Intente usar un tema diferente en el manifiesto o use esto alternativamente:

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

Luego, en el manifiesto, donde configuro la actividad principal para la actividad actual:

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

¡Espero que esto ayude!

Paolo Anghileri
fuente
1
El enlace de Google Docs y el getSupportActionBar()trabajado. ¡Gracias!
Rick
15

Si estaba usando AppCompatActivityy ha seguido el camino de no usarlo, porque no quería obtener el automático ActionBarque proporciona, porque desea separarlo Toolbar, debido a sus necesidades de Diseño de materiales y , CoordinatorLayouto AppBarLayout, entonces, considere esto:

Todavía puede usar el AppCompatActivity, no necesita dejar de usarlo solo para poder usar un <android.support.v7.widget.Toolbar>en su xml. Simplemente apague el estilo de la barra de acción de la siguiente manera:

Primero, deriva un estilo de uno de los temas de NoActionBar que te gusta en tu styles.xml, yo usé Theme.AppCompat.Light.NoActionBarasí:

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

En el manifiesto de su aplicación, elija el tema de estilo hijo que acaba de definir, así:

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

En su Activity Xml, si la barra de herramientas se define así:

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

Luego, y esta es la parte importante, configura la barra de acción de soporte para AppCompatActivity que está extendiendo, de modo que la barra de herramientas en su xml se convierta en la barra de acción. Creo que esta es una mejor manera, porque simplemente puede hacer las muchas cosas que ActionBar permite, como menús, título de actividad automática, manejo de selección de elementos, etc. sin recurrir a agregar controladores de clics personalizados, etc.

En la anulación onCreate de su Actividad, haga lo siguiente:

@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
fuente
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
fuente
Puedes usar retrolambda.
Artemiy
Esto es lo que tengo y no funciona. No puedo entenderlo.
filthy_wizard
7

Manera simple y fácil de mostrar el botón de retroceso en la barra de herramientas

Pegue este código en el método onCreate

 if (getSupportActionBar() != null){

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

Pegue este método de anulación fuera del método onCreate

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

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

En Kotlin sería

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
fuente
5

En el AppCompatActivitypor ejemplo puedes hacer

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

}
Desarrollador
fuente
4

En su archivo de manifiesto para la actividad en la que desea agregar un botón de retroceso, utilizaremos la propiedad android: parentActivityName

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

PS Este atributo se introdujo en el API Nivel 16.

Sunny Kumar Aditya
fuente
3

Esto funcionó perfectamente

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
fuente
3

Primero, debe inicializar la barra de herramientas:

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

luego llame al botón Atrás desde la barra de acción:

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

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

Si desea obtener la flecha hacia atrás en una barra de herramientas que no está configurada como su SupportActionBar:

(kotlin)

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

para obtener resolución de los atributos:

@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
}
Juan
fuente
1

Agregue esto al xml de la actividad en la carpeta de diseño:

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

Haga clic en la barra de herramientas, agréguelos al método 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
fuente
1

Posiblemente una forma más confiable de obtener el ícono hacia arriba de su tema (si no usa la barra de herramientas como su barra de acción):

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

Para convertir el atributo del tema en dibujable, utilicé una función de extensión:

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

Si está utilizando DrawerLayout con ActionBarDrawerToggle , para mostrar el botón Atrás en lugar del botón Menú (y viceversa), debe agregar este código en su Actividad:

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

Entonces, cuando necesite mostrar el botón Atrás en lugar del botón Menú , llame a showBackInToolbar (verdadero) , y si necesita el botón Menú , llame a showBackInToolbar (falso) .

Puede generar la flecha hacia atrás (ic_arrow_back_white_32dp) aquí , buscar arrow_back en la sección de imágenes prediseñadas (use el valor predeterminado de 32dp con 8dp de relleno). Solo selecciona el color que quieras.

Borzh
fuente
0

Siempre puede agregar una Relative layouto una Linear Layouten su Toolbary colocar una vista de imagen para el icono de atrás o cerrar el icono en cualquier lugar de la barra de herramientas como desee

Por ejemplo, he usado diseño relativo en mi barra de herramientas

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

Y se ve así:

ingrese la descripción de la imagen aquí

Puede agregar escucha de clics en esa vista de imagen desde Actividad o fragmento como este.

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

Con Kotlin se convirtió en:

Xml:

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

En su actividad: -

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

Si está utilizando JetPack Navigation.

Aquí está el diseño para 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"/>

Configure su barra de herramientas en su actividad como a continuación en onCreate () de su clase de Actividad.

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) Creará un botón de retroceso en la barra de herramientas si es necesario y maneja la funcionalidad backButton. Si necesita escribir una funcionalidad CustomBack, cree un callBack como se muestra a continuación en su método fragment onCreate ()

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

De la documentación: https://developer.android.com/guide/navigation/navigation-custom-back

Prakash
fuente
0

Si está utilizando el androidx.appcompat.app.AppCompatActivitysolo uso:

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

Luego simplemente defina en la Manifest.xmlActividad principal.

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

En cambio, si está utilizando Toolbaray desea un comportamiento personalizado, simplemente use:

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

y en tu actividad:

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