Как я могу создать панель инструментов appcompat-v7, например Theme.AppCompat.Light.DarkActionBar?

Я пытаюсь воссоздать внешний вид Theme.AppCompat.Light.DarkActionBar с помощью новой панели инструментов библиотеки поддержки.

Если я выберу Theme.AppCompat.Light, моя панель инструментов будет светлой, и если я выберу Theme.AppCompat, будет темно. (Технически вы должны использовать версию .NoActionBar, но насколько я могу судить, единственная разница -

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

Теперь нет Theme.AppCompat.Light.DarkActionBar, но наивно я думал, что будет достаточно, чтобы просто сделать свой собственный

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

Однако с этим мои панели инструментов остаются Light themed. Я потратил несколько часов на то, чтобы пробовать разные комбинации микширования темной (основной) темы и темы Light, но я просто не могу найти комбинацию, которая позволит мне иметь светлые фоны для всего, кроме панелей инструментов.

Есть ли способ получить вид AppCompat.Light.DarkActionBar с импортом android.support.v7.widget.Toolbar?

Ответ 1

Рекомендуемый способ стилизации панели инструментов для клона Light.DarkActionBar заключается в использовании Theme.AppCompat.Light.DarkActionbar в качестве темы parent/app и добавлении следующих атрибутов в стиль, чтобы скрыть ActionBar по умолчанию:

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

Затем используйте в качестве панели инструментов следующее:

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

Для дальнейших модификаций вы создадите стили, расширяющие ThemeOverlay.AppCompat.Dark.ActionBar и ThemeOverlay.AppCompat.Light, заменяя те, что находятся внутри AppBarLayout->android:theme и Toolbar->app:popupTheme. Также обратите внимание, что это заберет ваш ?attr/colorPrimary, если вы установили его в своем основном стиле, чтобы вы могли получить другой цвет фона.

Вы найдете хороший пример этого в текущем шаблоне проекта с Empty Activity для Android Studio (1.4 +).

Ответ 2

Изменить: после обновления до appcompat-v7: 22.1.1 и с помощью AppCompatActivity вместо ActionBarActivity мои 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="theme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>

Примечание. Это означает, что я использую Toolbar, предоставляемый каркасом (НЕ входит в файл XML).

Это сработало для меня:
Файл 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>

Обновление: цитата из Gabriele Mariotti blog.

С помощью новой панели инструментов вы можете применить стиль и тему.     Они разные!     Стиль является локальным для представления панели инструментов, например, цвета фона.     Приложение: тема вместо этого является глобальным для всех элементов ui, завышенных на панели инструментов, например, цвета заголовка и значков.

Ответ 3

Хорошо, после того, как я погрузился в много времени в эту проблему, мне удалось получить такой внешний вид, на который я надеялся. Я делаю это отдельным ответом, поэтому я могу получить все в одном месте.

Это комбинация факторов.

Во-первых, не пытайтесь заставить панели инструментов играть красиво через только темы. Это кажется невозможным.

Итак, примените темы явно к вашим панелям инструментов, например, в Ответы oRRs

расположение /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" />

Однако это волшебный соус. Чтобы на самом деле получить цвета фона, я надеялся, что вам придется переопределить атрибут background в темах панели инструментов

значения /styles.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>

затем просто включите макет панели инструментов в другие макеты

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

и вам хорошо идти.

Надеюсь, это поможет кому-то другому, поэтому вам не нужно тратить столько времени на это, как я.

(если кто-то может понять, как сделать эту работу, используя только те темы, то есть не нужно явно применять темы в файлах макета, я с радостью поддержу их ответ)

EDIT:

Таким образом, по-видимому, для более полного ответа был магнит с понижающим звуком, поэтому я просто соглашусь с неполным ответом выше, но оставим этот ответ здесь, если кому-то это действительно нужно. Не стесняйтесь держать downvoting, если это делает вас счастливым, хотя.

Ответ 4

Самый чистый способ, который я нашел для этого, - создать дочерний элемент ThemeOverlay.AppCompat.Dark.ActionBar. В этом примере я установил цвет фона панели инструментов RED и цвет текста в СИНИЙ.

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

Затем вы можете применить свою тему к панели инструментов:

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

Ответ 5

Yout может попробовать это ниже.

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

И элементы детали, которые вы можете найти в https://developer.android.com/reference/android/support/v7/appcompat/R.styleable.html#Toolbar

Вот еще несколько: TextAppearance.Widget.AppCompat.Toolbar.Title, TextAppearance.Widget.AppCompat.Toolbar.Subtitle, Widget.AppCompat.Toolbar.Button.Navigation.

Надеюсь, это поможет вам.

Ответ 6

Чтобы настроить стиль панели инструментов, сначала создайте собственный стиль панели инструментов, наследующий Widget.AppCompat.Toolbar, переопределите свойства, а затем добавьте их в тему пользовательского приложения, как показано ниже, см. http://www.zoftino.com/android-toolbar-tutorial для получения дополнительной информации панели инструментов и стилей.

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

Ответ 7

Как и у Арнава Рао, но с другим родителем:

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

При таком подходе внешний вид панели инструментов полностью определяется в стилях приложения, поэтому вам не нужно размещать какие-либо стили на каждой панели инструментов.