¿Cómo puedo diseñar la barra de herramientas appcompat-v7 como Theme.AppCompat.Light.DarkActionBar?

105

Estoy tratando de recrear el aspecto de Theme.AppCompat.Light.DarkActionBarcon la nueva barra de herramientas de la biblioteca de soporte.

Si elijo, Theme.AppCompat.Lightmi barra de herramientas será clara y si elijo Theme.AppCompatestará oscura. (Técnicamente tienes que usar la .NoActionBarversión, pero por lo que puedo decir, la única diferencia es

<style name="Theme.AppCompat.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

Ahora no hay, Theme.AppCompat.Light.DarkActionBarpero ingenuamente pensé que sería lo suficientemente bueno hacer el mío

<style name="Theme.AppCompat.Light.DarkActionBar.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
</style>

Sin embargo, con esto, mis barras de herramientas siguen siendo Lighttemáticas. He pasado horas probando diferentes combinaciones de mezclar el tema Oscuro (base) y el tema Claro, pero no puedo encontrar una combinación que me permita tener fondos claros en todo menos en las barras de herramientas.

¿Hay alguna forma de conseguir el AppCompat.Light.DarkActionBarlook con import android.support.v7.widget.Toolbar?

Liminal
fuente

Respuestas:

216

La forma recomendada de diseñar la barra de herramientas para un Light.DarkActionBarclon sería usar Theme.AppCompat.Light.DarkActionbarcomo tema principal / de aplicación y agregar los siguientes atributos al estilo para ocultar la barra de acciones predeterminada:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

Luego use lo siguiente como su barra de herramientas:

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>

Para modificaciones adicionales, crearía estilos extendiendo ThemeOverlay.AppCompat.Dark.ActionBary ThemeOverlay.AppCompat.Lightreemplazando los de AppBarLayout->android:themey Toolbar->app:popupTheme. También tenga en cuenta que esto se activará ?attr/colorPrimarysi lo ha configurado en su estilo principal, por lo que puede obtener un color de fondo diferente.

Encontrará un buen ejemplo de esto en la plantilla de proyecto actual con Empty ActivityAndroid Studio (1.4+).

oRRs
fuente
1
Bueno, sí puedes. "Si desea heredar de estilos que ha definido usted mismo, no es necesario que utilice el atributo principal. En su lugar, simplemente anteponga el nombre del estilo que desea heredar al nombre de su nuevo estilo, separado por un punto. . " developer.android.com/guide/topics/ui/themes.html#Inheritance
Liminal
1
También usando el xml que publicaste, obtengo una barra de herramientas blanca con texto blanco o si cambio el tema a ThemeOverlay.AppCompat.ActionBaruna barra de herramientas blanca con texto negro, por lo que no parece funcionar tan bien. No parece que al sistema le importe el <item name="android:colorBackground">@color/background_material_dark</item>in Base.ThemeOverlay.AppCompat.Dark. Pero seguiré investigando. (Y he leído esa página. Ese fue uno de mis puntos de partida. Todavía no parece funcionar.)
Liminal
1
Lo siento por eso. Dejó el color de fondo de la barra de herramientas para simplificar y no he probado los resultados. Revisé la respuesta en consecuencia. Sin embargo, no he encontrado una manera de hacer esto solo usando estilos. Como mi aplicación tiene diferentes combinaciones de colores, la uso android:background="?attr/colorPrimary"en la barra de herramientas y <item name="colorPrimary">@color/background_material_dark</item>en mi estilo para que adapte automáticamente el color principal de la aplicación.
oRRs
1
esto ya no funciona en la compatibilidad de la aplicación 23 y el título es negro y no blanco: /
Rashad.Z
21
¿Hay alguna forma de controlar esta jungla de temas y estilos?
2016
72

Editar: después de actualizar a appcompat-v7: 22.1.1 y usar en AppCompatActivitylugar de ActionBarActivitymy styles.xml se ve así:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

Nota: Esto significa que estoy usando un Toolbarmarco proporcionado por el marco (NO incluido en un archivo XML).

Esto funcionó para mí:
archivo styles.xml:

<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

Actualización: una cita del blog de Gabriele Mariotti .

Con la nueva barra de herramientas puede aplicar un estilo y un tema. ¡Ellos son diferentes! El estilo es local para la vista de la barra de herramientas, por ejemplo, el color de fondo. La aplicación: tema es global para todos los elementos de la interfaz de usuario inflados en la barra de herramientas, por ejemplo, el color del título y los iconos.

LordRaydenMK
fuente
"Error: no se encontró ningún recurso que coincida con el nombre dado: attr 'colorPrimary'". Estamos hablando de usar appcompat_v7 aquí.
Yar
Para mí, esto solo funciona en dispositivos Lollipop. En la pre-piruleta, no solo la barra de acción, sino toda la actividad usa el tema oscuro, que no es lo que quería. Voté a favor, pero al final usé la respuesta de oRR, diseñando la vista de la barra de herramientas única.
lorenzo-s
@ lorenzo-s Actualicé mi respuesta a la última versión de appcompat. También lo probé en Galaxy Nexus con Android 4.3 y está funcionando
LordRaydenMK
31

Ok, después de haberme sumergido mucho tiempo en este problema, esta es la forma en que logré obtener la apariencia que esperaba. Lo estoy convirtiendo en una respuesta separada para poder tener todo en un solo lugar.

Es una combinación de factores.

En primer lugar, no intente que las barras de herramientas funcionen bien solo con temas. Parece imposible.

Así que aplique temas explícitamente a sus barras de herramientas como en la respuesta de oRR

layout / toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_alignParentTop="true"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:theme="@style/Dark.Overlay"
    app:popupTheme="@style/Dark.Overlay.LightPopup" />

Sin embargo, esta es la salsa mágica. Para obtener los colores de fondo que esperaba, debe anular el backgroundatributo en los temas de la barra Google.

valores / estilos.xml:

<!-- 
    I expected android:colorBackground to be what I was looking for but
    it seems you have to override android:background
-->
<style name="Dark.Overlay" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">?attr/colorPrimary</item>
</style>

<style name="Dark.Overlay.LightPopup" parent="ThemeOverlay.AppCompat.Light">
    <item name="android:background">@color/material_grey_200</item>
</style>

luego solo incluye el diseño de tu barra de herramientas en tus otros diseños

<include android:id="@+id/mytoolbar" layout="@layout/toolbar" />

y listo.

Espero que esto ayude a alguien más para que no tenga que dedicar tanto tiempo a esto como yo.

(si alguien puede descubrir cómo hacer que esto funcione usando solo temas, es decir, sin tener que aplicar los temas explícitamente en los archivos de diseño, con gusto apoyaré su respuesta)

EDITAR:

Entonces, aparentemente, publicar una respuesta más completa fue un imán de votos negativos, así que aceptaré la respuesta incompleta anterior, pero dejaré esta respuesta aquí en caso de que alguien realmente la necesite. Sin embargo, no dudes en seguir votando negativamente si eso te hace feliz.

Liminal
fuente
2
En mi AppTheme acabo de poner <item name="colorPrimary">@color/colorPrimary</item> Entonces soy libre de usar el android:background="?attr/colorPrimary"atributo en mi widget de la barra Google.
lemuel
¿Puedo saber cómo se obtiene la definición de "@ color / material_grey_200"?
Cheok Yan Cheng
No recuerdo exactamente dónde, pero alguien hizo un archivo colors.xml basado en google.com/design/spec/style/color.html#color-color-palette pero no puedo encontrarlo ahora
Liminal
1
@Liminal Si usa @android:color/transparent, evita el problema cuando mantiene presionado / hace clic en un elemento del menú, hay un cuadro alrededor del texto. Esto también lo prueba en el futuro si el color de fondo claro cambia en el futuro.
Ryan R
Sin embargo, no funciona cuando usas CollapsingToolbarLayout.
arekolek
17

La forma más limpia que encontré para hacer esto es crear un elemento secundario de ' ThemeOverlay.AppCompat.Dark.ActionBar '. En el ejemplo, configuré el color de fondo de la barra de herramientas en ROJO y el color del texto en AZUL.

<style name="MyToolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">#FF0000</item>
    <item name="android:textColorPrimary">#0000FF</item>
</style>

Luego puede aplicar su tema a la barra de herramientas:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    app:theme="@style/MyToolbar"
    android:minHeight="?attr/actionBarSize"/>
Don
fuente
6
¡Dios mío, esto era todo! textColorPrimary! ¿Por qué fue esto tan difícil de encontrar en cualquier lugar?
Muppet
12

Para personalizar el estilo de la barra de herramientas, primero cree el estilo personalizado de la barra de herramientas heredando Widget.AppCompat.Toolbar, anule las propiedades y luego agréguelo al tema de la aplicación personalizada como se muestra a continuación, consulte http://www.zoftino.com/android-toolbar-tutorial para más información barra de herramientas y estilos.

   <style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="toolbarStyle">@style/MyToolBarStyle</item>
    </style>
    <style name="MyToolBarStyle" parent="Widget.AppCompat.Toolbar">
        <item name="android:background">#80deea</item>
        <item name="titleTextAppearance">@style/MyTitleTextAppearance</item>
        <item name="subtitleTextAppearance">@style/MySubTitleTextAppearance</item>
    </style>
    <style name="MyTitleTextAppearance" parent="TextAppearance.Widget.AppCompat.Toolbar.Title">
        <item name="android:textSize">35dp</item>
        <item name="android:textColor">#ff3d00</item>
    </style>
    <style name="MySubTitleTextAppearance" parent="TextAppearance.Widget.AppCompat.Toolbar.Subtitle">
        <item name="android:textSize">30dp</item>
        <item name="android:textColor">#1976d2</item>
    </style>
Arnav Rao
fuente
7

Puedes probar esto a continuación.

<style name="MyToolbar" parent="Widget.AppCompat.Toolbar">
    <!-- your code here -->
</style>

Y los elementos de detalle los puedes encontrar en https://developer.android.com/reference/android/support/v7/appcompat/R.styleable.html#Toolbar

Éstos son algunos más: TextAppearance.Widget.AppCompat.Toolbar.Title, TextAppearance.Widget.AppCompat.Toolbar.Subtitle, Widget.AppCompat.Toolbar.Button.Navigation.

Espero que esto le pueda ayudar.

Yong
fuente
1
Sip. Con ellos puedo llegar a conseguir el color de fondo correcto y finalmente descubrí cómo conseguir los colores de título correctos. Sin embargo, lo mejor en este momento es que no puedo averiguar de dónde obtiene su color el botón de desbordamiento. No importa lo que cambie, permanece tan oscuro que no se ve en mi barra de acción oscura. Si cambio el tema a oscuro, entonces es claro y se ve bien. Sin embargo, no importa cuánto investigue, no puedo entender cómo hacer que el ícono de desbordamiento se muestre claro cuando comencé con un tema claro
Liminal
0

Similar al de Arnav Rao, pero con un padre diferente:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

    <item name="toolbarStyle">@style/MyToolbar</item>
</style>

<style name="MyToolbar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:background">#ff0000</item>
</style>

Con este enfoque, la apariencia de la barra de herramientas está completamente definida en los estilos de la aplicación, por lo que no necesita colocar ningún estilo en cada barra de herramientas.

Craigmj
fuente
2
En realidad, android:toolbarStylees API 21+ para android.widget.Toolbar. toolbarStylees AppCompat para android.support.v7.widget.Toolbar.
Eugen Pechanec
Pensé que Android Studio me estaba dando un problema, pero en una segunda prueba, ¡tienes razón! Esas son buenas noticias: he podido reducir mi minSDK a 19 nuevamente, y parece que mi toolbarStyle sigue funcionando bien. ¡Gracias!
craigmj
¡Me acabo de dar cuenta! Sigue existiendo un malentendido entre estilos y temas . MyToolbarel estilo no debe extenderse a Widget.AppCompat.Toolbarun tema.
Eugen Pechanec