Thecom.AppCompat.Light.DarkActionBarのようなappcompat-v7 Toolbarをどのようにスタイルするのですか?


105

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テーマ化されています。ダーク(ベース)テーマとライトテーマの混合のさまざまな組み合わせを試すのに何時間も費やしましたが、ツールバー以外のすべての背景を明るくできる組み合わせを見つけることができません。

AppCompat.Light.DarkActionBarimportで外観を取得する方法はありandroid.support.v7.widget.Toolbarますか?

回答:


216

Light.DarkActionBarクローンのツールバーのスタイルを設定する推奨される方法はTheme.AppCompat.Light.DarkActionbar、親/アプリのテーマとして使用し、次の属性をスタイルに追加して、デフォルトのアクションバーを非表示にすることです。

<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以降)の現在のプロジェクトテンプレートにあります。


1
ええ、そうです。「自分で定義したスタイルから継承する場合は、親属性を使用する必要はありません。代わりに、継承するスタイルの名前の前に、ピリオドで区切って新しいスタイルの名前を付けてください」developer.android.com/guide/topics/ui/themes.html#Inheritance
Liminal 2014年

1
また、投稿したxmlを使用すると、白いテキストの白いツールバーが表示されます。テーマを変更するThemeOverlay.AppCompat.ActionBarと、黒いテキストの白いツールバーが表示されるため、うまく機能しないようです。システムの心配事のように見えるしていません<item name="android:colorBackground">@color/background_material_dark</item>の中でBase.ThemeOverlay.AppCompat.Dark。しかし、私は掘り続けます。(そして、私はそのページを読みました。それは私の出発点の1つでした。それでも機能しないようです。)
Liminal '22 / 10/22

1
申し訳ありません。簡単にするために、ツールバーの背景色は省略し、結果をテストしていません。私はそれに応じて答えを修正しました。ただし、スタイルのみを使用してこれを行う方法は見つかりませんでした。アプリにはさまざまな配色があるのでandroid:background="?attr/colorPrimary"、ツールバーと<item name="colorPrimary">@color/background_material_dark</item>スタイルで使用して、アプリのプライマリカラーを自動的に調整します。
oRR

1
これはアプリ互換23でもう機能しておらず、タイトルは黒で白ではありません:/
Rashad.Z

21
このテーマとスタイルのジャングルを把握する方法はありますか?
axd 2016

72

編集:appcompat-v7:22.1.1に更新して、styles.xmlのAppCompatActivity代わりに使用するとActionBarActivity、次のようになります。

<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のブログ

新しいツールバーを使用すると、スタイルとテーマを適用できます。彼らは違う!スタイルは、背景色など、ツールバービューに対してローカルです。app:themeは、タイトルやアイコンの色など、ツールバーでインフレートされたすべてのUI要素に対してグローバルです。


「エラー:指定された名前に一致するリソースが見つかりません:attr 'colorPrimary'。」ここではappcompat_v7の使用について説明します。
Yar

私にとって、これはLollipopデバイスでのみ機能します。プレロリポップでは、アクションバーだけでなく、すべてのアクティビティでダークテーマを使用しますが、これは私が望んでいたものではありません。私は賛成票を投じましたが、最後にoRRの回答を使用して、単一のツールバービューをスタイルしました。
lorenzo-s

@ lorenzo-s appcompatの最新バージョンに合わせて回答を更新しました。私はまた、Android 4.3を搭載したGalaxy Nexusでテストしましたが、
正常に機能し

31

この問題に多くの時間を費やした後、これが私が期待していた外観をどうにかして得た方法です。すべてを1か所で取得できるように、別の答えにしています。

それは要因の組み合わせです。

まず、テーマだけでツールバーをうまく再生しようとしないでください。それは不可能のようです。

したがって、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" />

しかし、これは魔法のソースです。実際に背景色を取得するにはbackground、ツールバーのテーマの属性を上書きする必要があると思っていました

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

そして、あなたは行ってもいいです。

これが他の人を助けるので、私と同じくらい多くの時間を費やす必要がないことを願っています。

(誰かがテーマだけを使用してこの作業を行う方法を理解できる場合、つまりレイアウトファイルでテーマを明示的に適用する必要がない場合、代わりに喜んで回答をサポートします)

編集:

したがって、より完全な回答を投稿することは明らかに反対投票であったため、上記の不完全な回答はそのまま受け入れますが、誰かが実際に必要とする場合に備えて、この回答はここに残してください。それでもあなたを幸せにするなら、遠慮なく投票を続けてください。


2
AppThemeに次のように配置しました。ツールバーウィジェットで属性を<item name="colorPrimary">@color/colorPrimary</item> 自由に使用できandroid:background="?attr/colorPrimary"ます。
lemuel、2015

「@ color / material_grey_200」の定義をどのように取得できますか?
Yan Cheng

正確な場所は覚えていませんが、誰かがgoogle.com/design/spec/style/color.html#color-color-paletteに基づいてcolors.xmlファイルを作成しました が、今は見つかりません
Liminal

1
@Liminalを使用@android:color/transparentすると、メニュー項目を長押し/クリックしたときに問題が回避され、テキストの周りにボックスが表示されます。これはまた、明るい背景色が将来変化した場合の将来の証拠にもなります。
ライアンR

ただし、CollapsingToolbarLayoutを使用する場合は機能しません。
arekolek 2017年

17

これを行うために見つけた最もクリーンな方法は、「ThemeOverlay.AppCompat.Dark.ActionBar」の子を作成することです。この例では、ツールバーの背景色を赤に、テキストの色を青に設定しています。

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

6
これが私の神でした!textColorPrimary!なぜこれはどこでも見つけるのが大変だった
Muppet

12

ツールバーのスタイルをカスタマイズするには、最初の参照、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="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.TitleTextAppearance.Widget.AppCompat.Toolbar.SubtitleWidget.AppCompat.Toolbar.Button.Navigation

これがお役に立てば幸いです。


1
うん。それらで私は背景色を正しくすることまで得ることができ、最終的にタイトル色を正しくする方法を理解しました。しかし、今のところキラーなのは、オーバーフローボタンがどこに色を表示するかわからないということです。何を変更しても、暗いままなので、暗いアクションバーには表示されません。テーマを暗い色に変更すると、明るくて見栄えがよくなります。ただし、どれだけ掘り下げても、明るいテーマで始めたときにオーバーフローアイコンを明るく表示する方法がわかりません
Liminal

0

Arnav Raoに似ていますが、親が異なります。

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

このアプローチでは、ツールバーの外観はアプリスタイルで完全に定義されるため、各ツールバーにスタイルを設定する必要はありません。


2
実際にandroid:toolbarStyleはAPI 21+ですandroid.widget.ToolbartoolbarStyleAppCompat for android.support.v7.widget.Toolbarです。
Eugen Pechanec

Android Studioに問題があると思っていましたが、2番目のテストで正解です。それは素晴らしいニュースです。minSDKを再び19に下げることができました。toolbarStyleはまだ正常に機能しているようです。ありがとうございました!
craigmj 2017年

気づいた!スタイルテーマの誤解はまだありますMyToolbarスタイルはWidget.AppCompat.Toolbarテーマではなく拡張する必要があります。
Eugen Pechanec
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.