文档章节

Android主题与Toolbar样式之间的关系

zhyihui
 zhyihui
发布于 2016/07/13 17:57
字数 1728
阅读 153
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

前言

最近这几天被Android主题与Toolbar样式搞晕了,因为本来自己的Android根基就浅,对这方面又一直没有深入了解过;后来在Google上搜索到一篇文章:Android: Changing the Toolbar’s text color and overflow icon color,该文章对这方面有一定描述,帮助我理解了一些内容。 然后我试着将这篇文章翻译了一下,想着不明白的时候再回来查阅,译文:Android:改变 Toolbar 的文字和溢出图标颜色。 今天又测试一下相关内容,这里写点东西记一下。

目的

我的最终目的是在Light主题上得到深色Toolbar背景色和白色菜单按钮,包括溢出菜单背景色和Menu项字体颜色都一致,如下图所示:

输入图片说明

下面描述一下如何得到这么一个效果。

最初的样子

新创建项目时在style.xml中定义一下AppTheme并在AndroidManifest.xml文件中指定为App的主题(android:theme="@style/AppTheme"),Style定义如下所示:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

可以看到我们的自定义主题继承自“Theme.AppCompat.Light.NoActionBar”,这是向下兼容的浅色无ActionBar材料主题,Light表示浅色主题,NoActionBar表示没有默认的ActionBar;主题定义中有几个颜色定义,它们的具体含义网上很容易可以找到,这里不解释这些东西。 然后定义一个Toolbar,并在应用中包含进一个Activity布局文件中

<android.support.v7.widget.Toolbar
    android:id="@id/toolbar"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimary"/>

其它测试代码省略。这时我们运行一下,可以看到界面如下所示:

这里写图片描述

这里写图片描述

感觉黑色的标题和菜单真的好丑,因为浅色主题期 App Bar (Toolbar 或者 ActionBar)拥有浅色背景,因此给你用上了黑色的标题和溢出菜单图标,包括菜单字体的颜色。

定义溢出菜单样式

我们看到上面的效果图中溢出菜单是覆盖在Toolbar之上的,我希望它能像微信中的一样出现在Toolbar下面,可以通过自定义样式来做到这些。 在style.xml中定义OverflowMenuStyle样式如下所示:

<style name="OverflowMenuStyle" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
    <!-- 是否覆盖锚点,默认为true,即盖住Toolbar -->
    <item name="overlapAnchor">false</item>
    <!-- 弹出层背景颜色 -->
    <item name="android:popupBackground">@color/colorPrimary</item>
    <!-- 弹出层垂直方向上的偏移,即在竖直方向上距离Toolbar的距离,值为负则会盖住Toolbar -->
    <item name="android:dropDownVerticalOffset">5dp</item>
    <!-- 弹出层水平方向上的偏移,即距离屏幕左边的距离,负值会导致右边出现空隙 -->
    <item name="android:dropDownHorizontalOffset">0dp</item>
</style>

这时有两种方式应用这个样式:

  1. 在AppTheme中指定(主题定义中加入下面代码)
<item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
  1. 在Toolbar定义中指定(app:popupTheme属性)
<android.support.v7.widget.Toolbar
    android:id="@id/toolbar"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:popupTheme="@style/OverflowMenuStyle"/>

这时我们运行App,效果如下所示:

这里写图片描述

溢出菜单的弹出层已经位于Toolbar的下方了,而且背景色也改为我们期望的colorPrimary颜色。 接下来我们尝试改变一下标题和溢出菜单项的文字颜色。

Dark主题

这时改变标题和溢出图标为白色的最简单方法就是使用Dark主题作为我们的App主题,因为Dark主题会默认使用白色的标题和溢出菜单图标,那么我们试一下。 修改AppTheme的父主题为“Theme.AppCompat.NoActionBar”,该部分代码如下所示:

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
</style>

运行效果如下所示:

这里写图片描述

这时已经很接近我的目标了,但由于用的是Dark主题,因此TextView的背景色是黑色的,我不希望我的大部分UI控件都是深色系统的,因此这种方式我不想采用。

我把AppTheme的parent改回“Theme.AppCompat.Light.NoActionBar”主题,这时再看一遍当前的运行效果:

这里写图片描述

这是浅色主题下的表现,接下来尝试改变这些黑色字体。

改变Toolbar主题

Android 5.0引入一个全新的特性,允许你对view设置theme,这种设置会影响控件及其包含的子控件。 使用AppCompat v22.1.x 后,也可以给你 layout 里的任意视图设置主题。 只要使用 android:theme 这个属性就好,新版本的兼容库可以在 compat 和 framework 之间无缝地切换功能。

从上面的描述中可以得知,我们可以单独为Toolbar设置主题,主题中的样式将影响Toolbar本身及其子View;因此我们考虑是否可以为Toolbar设置一个深色主题,这样系统会将标题和溢出图标等元素颜色设置为白色。 尝试将Toolbar主题设置为“ThemeOverlay.AppCompat.Dark.ActionBar”如下所示:

android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"

运行App可以看到确实有效果,这样我们就可以得到开关描述的效果了(浅色主题下Toolbar使用深色背景,并且将标题、溢出图标及溢出菜单文字改为白色)。

最终效果

看一下最终的style.xml文件:

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

<style name="OverflowMenuStyle" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
    <!-- 是否覆盖锚点,默认为true,即盖住Toolbar -->
    <item name="overlapAnchor">false</item>
    <!-- 弹出层背景颜色 -->
    <item name="android:popupBackground">@color/colorPrimary</item>
    <!-- 弹出层垂直方向上的偏移,即在竖直方向上距离Toolbar的距离,值为负则会盖住Toolbar -->
    <item name="android:dropDownVerticalOffset">5dp</item>
    <!-- 弹出层水平方向上的偏移,即距离屏幕左边的距离,负值会导致右边出现空隙 -->
    <item name="android:dropDownHorizontalOffset">0dp</item>
</style>

Toolbar组件的定义代码:

<android.support.v7.widget.Toolbar
    android:id="@id/toolbar"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimary"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

再看一遍最终效果图吧!

这里写图片描述

其它知识点

改变Title颜色为白色

在AppTheme定义中可以加入如下代码改变Title的颜色:

<item name="titleTextColor">@android:color/white</item>

改变menu菜单字体颜色

在AppTheme中加入如下代码可改变Toolbar非溢出菜单字体颜色:

<item name="actionMenuTextColor">@android:color/white</item>

后记

折腾了几天,虽然最终弄明白了一点相关知识,也达到了自己最终的目标,但关于Android主题这方面我仍然知之甚少。 任重而道远啊!

© 著作权归作者所有

zhyihui
粉丝 0
博文 5
码字总数 10549
作品 0
德州
程序员
私信 提问
android5.0+(Toolbar)

Toolbar Toolbar是什么?大概说一下它的官方介绍。Toolbar是应用的内容的标准工具栏,可以说是Actionbar的升级版,两者不是独立关系,要使用Toolbar还是得跟ActionBar扯上关系的。相比Actio...

让代码飞一会
2015/07/28
962
2
apkplug主题皮肤切换之通用主题-04

该文章基于V1.6.9版本 apkplug主题切换有两个层次的切换,这篇文章只讲解通用主题切换层次 一 何为通用主题切换 apkplug通用主题切换可以简单的理解为一套可动态替换的系统主题(由主题包提供...

梁大帅
2014/05/26
72
0
appcompat v21: 让 Android 5.0 前的设备支持 Material Design

今天Android 5.0 SDK正式出炉,随之而来的是许多的升级,其中包括新的UI控件以及卡片式主题设计。为了使您能够在旧的平台上使用升级后的设计模式,我们同时升级了支持库( support librarie...

Haffe
2014/11/09
19.6K
3
Android Jetpack之AppCompat(一)

今天我们来聊一聊有关AppCompat,作为Android Jetpack系列文章的开篇。说到Android Jetpack,我们先看一下这张图: 从图中我们可以看到,整个Android Jetpack分为了四大部分,而我们今天要讲...

萧文翰
03/11
0
0
android官方控件DrawerLayout和Toolbar地配合使用

接下来是Layout文件: 最后是Activity: 最后是Menu的布局文件:

fantasiter
2015/08/23
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

mars-config 动态配置管理

mars-config 码云地址:https://gitee.com/fashionbrot/mars-config 介绍 spring mvc 、springboot 动态配置系统。http 轮训方式 更新 动态配置 软件架构 软件架构说明 后端使用技术 :sprin...

fashionbrot
12分钟前
6
0
女朋友玩吃鸡手游被开挂老哥骗炮,我见义勇为将骗子绳之以法

大家好,我是乔哥。 晚上10点以后下班后我回到自如出租房里面,开始处理公众号粉丝发来的消息,一条一条处理,突然看到了这么几条消息,吸引了我的眼球: 然后我就和这位女粉丝小红(化名)聊...

gzc426
17分钟前
2
0
两款软件

fadetop保护眼睛软件 Snipaste截图软件

伟大源于勇敢的开始
43分钟前
6
0
06.全局锁和表锁

根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。 全局锁 全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是flush tables with read lock(FTW...

scgaopan
今天
7
0
图解安装CentOS8

最近正式发布了CentOS8!迫不及待地准备下载了CentOS8镜像,准备体验下,工作繁忙无暇理会。 今天抽空安装体验下~ 可从CentOS官网下载:https://centos.org/download/ 为了快速可以选择从国...

技术训练营
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部