Barra de herramientas de AppCompat: establece el tema de la barra de herramientas desde el tema superior

Tengo una aplicación "light" con:

<style name="Theme.MyTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primary_dark</item> <item name="colorAccent">@color/accent</item> <!-- etc. --> </style> 

Quiero que mi Toolbar sea ​​de temática oscura, así que he configurado el siguiente estilo, tal como sugiere Chris Banes :

 <style name="Theme.MyTheme.Toolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar"> <!-- stuff --> </style> 

Luego, al agregar android:theme="@style/Theme.ByodTheme.Toolbar" a mi android.support.v7.widget.Toolbar , todo funciona como se esperaba (aunque la vista previa de Android Studio no muestra colores blancos para el título , Funciona en dispositivos):

Aplicación regular del tema

Ahora, en lugar de especificar android:theme para cada barra de herramientas en mi aplicación, me gustaría especificar el estilo en mi tema principal y olvidarlo. He intentado la propiedad toolbarStyle , pero parece que no funciona como se pretende, ya que completamente desorden las propiedades estándar:

Intento con toolbarStyle

También he hecho otros intentos haciendo heredar el tema de la barra de herramientas de Widget.AppCompat.Toolbar , y cambiando titleTextAppearance y subtitleTextAppearance , pero luego parece imposible cambiar el color del icono de desbordamiento (sí, he intentado establecer actionOverflowButtonStyle y heredar ese estilo Desde Widget.AppCompat.ActionButton.Overflow , sin éxito en el cambio del color del icono de desbordamiento).

¿Hay una manera de especificar, desde un solo punto, el tema principal de cada barra de herramientas en mi aplicación?

Puede utilizar un atributo personalizado para esto, básicamente, sólo configure sus barras de herramientas para utilizar un valor personalizado que definirá en el tema.

 <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="?attr/toolbar_theme" /> 

La parte importante es simplemente android:theme="?attr/toolbar_theme" que hace referencia a un atributo personalizado del tema actual.

Deberá declarar este atributo en algún lugar, así:

 <resources> <attr name="toolbar_theme" format="reference" /> </resources> 

A continuación, puede definir qué valor desea que utilice la barra de herramientas asignando un valor a toolbar_theme en su tema. Por ejemplo, para usar Theme.MyTheme.Toolbar puedes definirlo de la siguiente manera:

 <style name="Theme.MyTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primary_dark</item> <item name="colorAccent">@color/accent</item> <!-- etc. --> <item name="toolbar_theme">@style/Theme.MyTheme.Toolbar</item> </style> 

Lo bueno de usar un atributo es que permite que tu aplicación tenga varios temas, y ese único recurso de barra de herramientas usará cualquier valor que hayas establecido dentro del tema.

Si entiendo la pregunta correctamente, desea definir el tema de su aplicación una vez y aplicar todo el estilo a todas las barras de herramientas en cada actividad / fragmento.

Si es así, recomendaría este enfoque:

 <style name="MyTheme" parent="Theme.AppCompat.NoActionBar"> <item name="android:textColorPrimary">@color/MyColorPrimaryText</item> <item name="android:windowBackground">@color/MyColorWindowBackground</item> <item name="colorPrimary">@color/MyColorPrimary</item> <item name="colorPrimaryDark">@color/MyColorPrimaryDark</item> <item name="colorAccent">@color/MyColorAccent</item> <item name="colorControlNormal">@color/MyColorControlNormal</item> <item name="colorControlHighlight">@color/MyColorControlHighlight</item> <item name="toolbarStyle">@style/MyToolbar</item> <item name="windowActionModeOverlay">true</item> <item name="actionModeBackground">@color/MyColorPrimaryDark</item> </style> <style name="MyToolbar" parent="Widget.AppCompat.Toolbar"> <item name="android:layout_width">match_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:minHeight">@dimen/MyToolbarMinHeight</item> <item name="android:gravity">center_vertical</item> <item name="android:background">@color/MyColorPrimary</item> <item name="android:elevation" tools:ignore="NewApi">10dp</item> <item name="theme">@style/MyToolbarTheme</item> </style> <style name="MyToolbarTheme" parent="ThemeOverlay.AppCompat.ActionBar"> <item name="android:textColorPrimary">@color/MyColorPrimaryText</item> <item name="colorControlNormal">@color/MyToolbarColorControlNormal</item> <item name="colorControlHighlight">@color/MyToolbarColorControlHighlight</item> </style> 

Entonces en su manifiesto:

 <application android:name=".MyApp" android:theme="@style/MyTheme"> <activity android:name=".MyActivity1"/> <activity android:name=".MyActivity2"/> </application> 

A continuación, en los archivos de diseño de la actividad, incluya la barra de herramientas con:

 style="?attr/toolbarStyle" 

Así que el archivo de diseño myActivity1.xml se vería así:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.Toolbar android:id="@+id/appBar" android:layout_width="match_parent" android:layout_height="wrap_content" style="?attr/toolbarStyle" /> <!-- ETC. --> </LinearLayout> 

Y observe que para cambiar el color del botón de retroceso de la navegación o los colores del botón de desbordamiento, puede establecer:

 <item name="colorControlNormal">@color/MyColorControlNormal</item> <item name="colorControlHighlight">@color/MyColorControlHighlight</item> 

Y:

 <item name="android:textColorPrimary">@color/MyColorPrimaryText</item> 

Se puede utilizar para actualizar el color de texto de la barra de acciones, pero se debe definir en el tema de la barra de herramientas.

Espero que esto ayude.

  • Android Cómo implementar la Hoja inferior de Documentos de diseño de materiales
  • WebView en problemas con NestedScrollView
  • Animación FAB con viewpager / tabslider
  • Android: Fotos de Google como Vista de cuadrícula con funcionalidad de zoom
  • Título de la barra de herramientas de contracción no está cambiando al establecer dinámicamente?
  • CollapsingToolbarLayout | Problemas de desplazamiento y diseño 2
  • Cambiar el color de texto del título de ActionBar usando el tema Light.DarkActionBar en AppCompat 21
  • ¿Por qué GoogleMaterial.Icon no tiene el icono de cierre de sesión en la biblioteca de Android?
  • Android: cambiar dinámicamente el icono FAB (botón de acción flotante) del código
  • Efecto de elevación para ImageButton en dispositivos Pre-Lollipop
  • ¿Cómo puedo desactivar el valor alfa de Android Lollipop ripple?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.