Cómo personalizar el botón de retroceso en ActionBar

188

He podido personalizar el fondo de la barra de acción, la imagen del logotipo y el color del texto usando sugerencias de estos:
Android: ¿Cómo cambiar el icono "Inicio" de ActionBar para que sea algo más que el icono de la aplicación?
Color de texto de
ActionBar Imagen de fondo de ActionBar

La última pieza que quiero personalizar es la imagen del botón Atrás. Es gris por defecto y me gustaría que fuera blanco. Cambiar el color, especificar un dibujo o simplemente hacerlo transparente (y agregar el cheurón a mi imagen de logotipo personalizada) funcionaría. ¿Cómo hago para eso?

Sunil Gowda
fuente
1
No hay botón ATRÁS en la barra de acción. El botón BACK está en la barra del sistema o no está en la pantalla (para dispositivos con un botón BACK fuera de la pantalla).
CommonsWare
1
@CommonsWare, no estoy seguro de cómo se llama el 'galón izquierdo' en la barra de acción, pero a eso me refiero como el botón de retroceso. Creo que se espera que reemplace el botón de retroceso físico en dispositivos Android en el futuro.
Sunil Gowda
13
No y no. Ese es el indicador "arriba" (a pesar de la orientación de la flecha). Lo habilitas a través de setDisplayHomeAsUpEnabled()on ActionBar. Específicamente NO se supone que debe simplemente "retroceder". Significa que al tocar el ícono de la aplicación "subirá" una jerarquía en lugar de volver a la actividad anterior (al igual que el botón ATRÁS en la barra del sistema).
CommonsWare
2
"Entonces, ¿qué pasa con los nuevos dispositivos que no tienen un botón de retroceso físico? ¿Todos muestran un botón de retroceso" suave "? Todos deben tener un botón de retroceso en la barra del sistema.
CommonsWare
3
solo quiero agregar en muchos casos el botón ARRIBA simplemente VOLVERÁ . Consulte "Cuando la pantalla vista anteriormente también es el padre jerárquico de la pantalla actual, presionar la tecla Atrás tendrá el mismo resultado que presionar un botón Arriba: esto es algo común" de developer.android.com/design/patterns /navigation.html
Dori

Respuestas:

390

El indicador de disponibilidad "hacia arriba" lo proporciona un elemento extraíble especificado en el homeAsUpIndicatoratributo del tema. Para anularlo con su propia versión personalizada, sería algo como esto:

<style name="Theme.MyFancyTheme" parent="android:Theme.Holo">
    <item name="android:homeAsUpIndicator">@drawable/my_fancy_up_indicator</item>
</style>

Si es compatible con pre-3.0 con su aplicación, asegúrese de incluir esta versión del tema personalizado values-v11o similar.

Jake Wharton
fuente
10
A mí también me funciona. Estaba declarando dentro del conjunto de estilos como mi ActionBarStyle como en AOSP en github, pero no funcionaba: pasar al tema principal fue el truco. +1
Dori
37
<item name="android:homeAsUpIndicator">@drawable/my_fancy_up_indicator</item>no funcionó para mí, pero lo <item name="homeAsUpIndicator">@drawable/my_fancy_up_indicator</item>hizo. Supongo que es la versión de Android
Michał K
66
¿Hay alguna forma de establecer el relleno superior e inferior para esto en 0dp?
James McCracken
3
@JamesMcCracken, la única forma en que pude hacer esto fue a través de un diseño personalizado.
greg7gkb
44
¿Alguien hizo esto funcionar Navigation Drawer? Supongo que ActionBarDrawerTogglereemplaza el indicador con uno de los suyos, por lo tanto, de colocarlo en el estilo no tiene ningún efecto ...
Lucas Jota
89

Por lo tanto, puede cambiarlo programáticamente fácilmente utilizando la función homeAsUpIndicator () que se agregó en la API de Android nivel 18 y superior.

ActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);

Si usa la biblioteca de soporte

getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);

Hitman Snipe
fuente
55
Si está utilizando un cajón, debe llamar drawerToggle.setDrawerIndicatorEnabled(false);antes de cambiar el indicador
Floss
2
@Floss Gracias, setDrawerIndicatorEnabled (falso / verdadero); resolvió mi problema para configurar el botón de inicio como 'Atrás' y (Abrir cajón / Cerrar cajón) consistentes según mis requisitos.
Ashraf Alshahawy
1
@Floss drawerToggle.setDrawerIndicatorEnabled (falso); funciona para mí :)
Contexto
30

He revisado la pregunta. Aquí están los pasos que sigo. El código fuente está alojado en GitHub: https://github.com/jiahaoliuliu/sherlockActionBarLab

Reemplazar el estilo real para los dispositivos anteriores a v11.

Copie y pegue el código de seguimiento en el archivo styles.xml de la carpeta de valores predeterminados.

<resources>
    <style name="MyCustomTheme" parent="Theme.Sherlock.Light">
    <item name="homeAsUpIndicator">@drawable/ic_home_up</item>
    </style>
</resources>

Tenga en cuenta que el padre podría cambiarse a cualquier tema de Sherlock.

Reemplazar el estilo real para los dispositivos v11 +.

En la misma carpeta donde están los valores de la carpeta, cree una nueva carpeta llamada values-v11. Android buscará automáticamente el contenido de esta carpeta para dispositivos con API o superior.

Cree un nuevo archivo llamado styles.xml y pegue el siguiente código en el archivo:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyCustomTheme" parent="Theme.Sherlock.Light">
    <item name="android:homeAsUpIndicator">@drawable/ic_home_up</item>
    </style>
</resources>

Tenga en cuenta que el nombre del estilo debe ser el mismo que el archivo en la carpeta de valores predeterminados y en lugar del elemento homeAsUpIndicator, se llama android: homeAsUpIndicator.

El problema del artículo se debe a que para los dispositivos con API 11 o superior, la barra de acción Sherlock usa la barra de acción predeterminada que viene con Android, cuyo nombre clave es android: homeAsUpIndicator. Pero para los dispositivos con API 10 o inferior, Sherlock Action Bar usa su propia ActionBar, que el indicador de inicio como arriba se llama simple "homeAsUpIndicator".

Usa el nuevo tema en el manifiesto

Reemplace el tema para la aplicación / actividad en el archivo AndroidManifest:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/MyCustomTheme" >
jiahao
fuente
2
Y puede probar @ drawable / abc_ic_ab_back_holo_light o @ drawable / abc_ic_ab_back_holo_dark si está buscando íconos de holo ya disponibles.
Mason Lee
25

Cambiar el icono de navegación hacia atrás es diferente para ActionBar y Toolbar.

Para el atributo de anulación de ActionBar homeAsUpIndicator:

<style name="CustomThemeActionBar" parent="android:Theme.Holo">
    <item name="homeAsUpIndicator">@drawable/ic_nav_back</item>
</style>

Para el navigationIconatributo de anulación de la barra de herramientas :

<style name="CustomThemeToolbar" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="navigationIcon">@drawable/ic_nav_back</item>
</style>
duviteck
fuente
19

Hice el siguiente código onCreate()y trabajé conmigo

getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_yourindicator);
Waleed A. Elgalil
fuente
5

Si está utilizando la barra Google, no necesita esas soluciones. Solo tienes que cambiar el tema de la barra de herramientas

app:theme="@style/ThemeOverlay.AppCompat.Light"

app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"

Si está utilizando un dark.actionBar, el botón de retroceso será blanco; de lo contrario, si está utilizando un tema de barra de acción claro, será negro.

Oguz Ozcan
fuente
Su código funciona para mí, pero ¿podemos cambiar el color de ese indicador?
Steve Luck
2
colorControlNormal y android: los valores textColorSecondary son responsables de eso, pero no estoy muy seguro de qué más estos valores también cambian. Puede probarlo definiendo estos valores en el tema de su barra de herramientas.
Oguz Ozcan
Estoy usando "app: theme =" @ style / ThemeOverlay.AppCompat.Light "" para mostrar navigationIcon en fondo blanco, pero muestra el icono gris predeterminado, necesito cambiarlo a azul. "colorControlNormal y android: textColorSecondary" no funciona.
Steve Luck
2
Utilice un tema personalizado que tenga "ThemeOverlay.AppCompat.Light" como padre. Esto podría funcionar.
Oguz Ozcan
1
Encontré la solución para cambiar el ícono de navegación, usando name = "colorControlNormal" not name = "android: colorControlNormal". Pero quiero cambiar al otro dibujable, ¿tal vez?
Steve Luck
2

bandeja esto:

getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close);

en el interior onCreate();

Abdurahman Popal
fuente
Está funcionando, pero cómo volver antes Botón de retroceso
Nadimuddin
0

Usé la imagen back.png en el archivo menifest.xml del proyecto. Está bien trabajar en el proyecto.

<activity
        android:name=".YourActivity"
         android:icon="@drawable/back"
        android:label="@string/app_name" >
    </activity>
Kulwant Singh Bhari
fuente
0

Tuve el mismo problema con la dirección del ícono del botón de inicio de la barra de acción, debido a la falta de administración del ícono en el ícono del directorio de recursos de Gradle

como en el directorio de recursos de Gradle en árabe, coloca el ícono en x-hdpi y en el recurso de Gradle en inglés el mismo nombre de icono que coloca en una carpeta de densidad diferente como xx-hdpi, de modo que en APK habrá dos mismos nombres de icono en diferentes directorios, por lo que su dispositivo elegirá el icono dependiente de la densidad puede ser RTL o LTR

user2508815
fuente