Android AppCompat工具栏:从上部主题设置工具栏主题

Android AppCompat工具栏:从上部主题设置工具栏主题,android,android-appcompat,material-design,android-theme,android-toolbar,Android,Android Appcompat,Material Design,Android Theme,Android Toolbar,我有一个以“灯光”为主题的应用程序: <style name="Theme.MyTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="colorPrimary">@color/primary</item> <item name="colorPrimaryDark">@color/primary_dark</item> <item nam

我有一个以“灯光”为主题的应用程序:

<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>
然后,通过将
android:theme=“@style/theme.ByodTheme.Toolbar”
添加到我的
android.support.v7.widget.Toolbar
,一切都按预期运行(即使android Studio预览没有显示标题的白色,它也可以在设备上运行):

现在,我不想为我的应用程序中的每个工具栏指定
android:theme
,而是想在我的主主题中指定样式,然后忘掉它。我尝试了
toolbarStyle
属性,但它似乎没有按预期工作,因为它完全弄乱了标准属性:

我还做了其他尝试,通过使工具栏主题继承自
Widget.AppCompat.Toolbar
,并通过更改
titletextearance
subtitletextearance
,但看起来无法更改溢出图标的颜色(是的,我尝试设置
actionOverflowButtonStyle
并从
Widget.AppCompat.ActionButton.Overflow
继承该样式,但未能成功更改溢出图标的颜色)


是否有一种方法可以从一个点为我的应用程序中的每个工具栏指定主主题?

您可以为此使用自定义属性——基本上只需将工具栏设置为使用将在主题中定义的自定义值即可

<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"
    />
然后,您可以通过为主题中的
toolbar\u theme
指定一个值来定义希望工具栏使用的值。例如,要使其使用
theme.myteme.toolbar
,您可以这样定义它:

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

@颜色/原色
@颜色/原色/深色
@颜色/口音
@style/Theme.myteme.Toolbar

使用属性的好处在于,它允许应用程序具有多个主题,并且单个工具栏资源将使用您在主题中设置的任何值。

如果我正确理解了这个问题,您希望设置一次应用程序的主题,并将所有样式应用于每个活动/片段中的所有工具栏

<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"
    />
如果是这样的话,我建议采取以下方法:

<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>
因此myActivity1.xml布局文件如下所示:

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

请注意,要更改导航后退按钮颜色或溢出按钮颜色,可以设置:

<item name="colorControlNormal">@color/MyColorControlNormal</item>
<item name="colorControlHighlight">@color/MyColorControlHighlight</item>
@color/MyColorControlNormal
@颜色/颜色控制高光
以及:

@color/MyColorPrimaryText
可用于更新actionbar文本颜色,但您需要在工具栏主题中定义它

希望这有帮助

style="?attr/toolbarStyle"
<?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>
<item name="colorControlNormal">@color/MyColorControlNormal</item>
<item name="colorControlHighlight">@color/MyColorControlHighlight</item>
<item name="android:textColorPrimary">@color/MyColorPrimaryText</item>