【问题标题】:AppCompat Toolbar: set toolbar theme from upper themeAppCompat Toolbar:从上部主题设置工具栏主题
【发布时间】:2015-07-25 23:19:00
【问题描述】:

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

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

我希望我的Toolbars 是深色主题,所以我设置了以下样式,正如Chris Banes 所建议的那样:

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

然后,通过将android:theme="@style/Theme.ByodTheme.Toolbar" 添加到我的android.support.v7.widget.Toolbar,一切都按预期进行(即使Android Studio 预览版的标题没有显示白色,但它可以在设备上运行):

现在,我不想为我的应用程序中的每个工具栏指定android:theme,而是想在我的主题中指定样式并忘记它。我已经尝试过 toolbarStyle 属性,但它看起来不像预期的那样工作,因为它完全弄乱了标准属性:

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

有没有办法从一个点为我的应用程序中的每个工具栏指定主题?

【问题讨论】:

    标签: android android-appcompat material-design android-theme android-toolbar


    【解决方案1】:

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

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

    其中重要的部分只是 android:theme="?attr/toolbar_theme",它引用了当前主题的自定义属性。

    您需要在某处声明此属性,如下所示:

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

    然后,您可以通过为主题中的toolbar_theme 分配一个值来定义您希望工具栏使用的值。例如,要使其使用Theme.MyTheme.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>
    

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

    【讨论】:

      【解决方案2】:

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

      如果是这样,我会推荐这种方法:

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

      然后在你的清单中:

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

      然后在您的活动布局文件中,包含工具栏:

      style="?attr/toolbarStyle"
      

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

      还有:

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

      可用于更新操作栏文本颜色,但您需要在工具栏主题中定义它。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-25
        相关资源
        最近更新 更多