Android ToolBar 完全解析

【Android】ToolBar,滑动菜单,悬浮按钮和可交互提示等的使用方法 Toolbar的强大之处在于,它不仅继承了 ActionBar的所有功能,而且灵活性很高,可以配合其他控件来完成一些Material Design的效果。任何一个新建的项目,默认都是会显示ActionBar。 阅读详情

       在上一篇文章中我们详细介绍了什么是 Material Design,以及一些 MD 的风格,接下来我们就来进行实战,而 ToolBar 将会是我们第一个来进行实战的 Material 控件,虽然对 ToolBar 还不是那么熟悉,但是相信另一个相关的控件我们是非常熟悉的,那就是 ActionBar,相信这个大家都是很熟悉了,没错,活动的顶部导航的那个标题栏其实就是 ActionBar,我们之前的应用开发中一定都有 ActionBar 的相关使用,不过 ActionBar 由于其设计原因,应用有一定的局限性,比如被限定只能位于活动的顶部,从而不能实现一些 MD 风格,因此官方已经不建议使用 ActionBar 了,强力推荐使用 ToolBar,那么 ToolBar 到底好在哪里,ToolBar 的强大之处就在于,它不仅继承了 ActionBar 的所用功能,而且灵活性很高,可以配合一些其他的控件来完成一些 MD 的效果,扯淡就到这里,接下来开始演绎

新建一个 MaterialDesign 项目,我们马上开始吧


一、项目的主题默认是在哪里指定的?


       首先我们要知道任何一个新建项目,默认都会显示 ActionBar,那么这个 ActionBar 到底是从哪里来的,其实这是根据项目中指定的主题来显示的,这里我们不妨打开我们新建项目的清单文件 AndroidManifest.xml 文件来看一下,如下所示:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.qiudengjiao.materialdesign">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

可以看到,这里使用 android:theme 属性指定了一个 AppTheme 的主题,那么我们再具体去看看这 AppTheme 的主题是怎么定义的,打开 AppTheme 定义如下:

<resources>

    <!-- Base application theme. -->
    <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>
    </style>

</resources>

这里定义了一个叫 AppTheme 的主题,然后指定它的 parent 主题是 Theme.AppCompat.Light.DarkAcionBar,这个 DarkActionBar 是一个深色的 ActionBar 主题,我们之前所有的项目中自带的 ActionBar 就是因为指定了这个主题才出现的,显示效果如下图: 



现在我们就要使用 ToolBar 来替代 ActionBar,因此需要指定一个不带 ActionBar 的主题,通常有如下两种主题可选:

  • Theme.AppCompat.NoActionBar
  • Theme.AppCompat.Light.NoActionBar
其中 Theme.AppCompat.NoActionBar 表示深色主题,它会将界面的主题颜色设计成深色,陪衬颜色设计成淡色,而 Theme.AppCompat.Light.NoActionBar 表示淡色主题,他会将界面的主题颜色设置成淡色,陪衬颜色设置成深色,具体效果如下图所示:


这里我们看到上图中没有了顶部的导航栏,左边是 Theme.AppCompat.NoActionBar 深色主题的,右边是 Theme.AppCompat.Light.NoActionBar 浅色主题的,也是我们项目中常用的,然后我们观察下 AppTheme 中的属性重写如下:

 <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

这里重写了 colorPrimary、colorPrimaryDark、colorAccent  这 3 个属性的颜色,那么这 3 个属性的颜色分别代表着什么位置的颜色呢?我们用语言太难描述清楚,直接上图吧,这张图大家也见过,来自 Google 官方网站,如下:





可以看到每个属性值指定的颜色一目了然,代码描述如下:

<style name="AppTheme.NoActionBar">
    <!--状态栏颜色-->
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <!--控制各个控件被选中时的颜色-->
    <item name="colorAccent">@color/colorAccent</item>
    <!--页面背景色-->
    <item name="android:windowBackground">@color/windowBackg</item>
    <!--底部导航栏颜色-->
    <item name="android:navigationBarColor">@color/navigationColor</item>
    <!--Appbar背景色-->
    <item name="android:colorPrimary">@color/colorPrimary</item>
    <!--ToolBar上的Title颜色-->
    <item name="android:textColorPrimary">@color/textColorPrimary</item>
    <!--各个控制控件的默认颜色-->
    <item name="android:colorControlNormal">@color/colorControlNormal</item>
</style>

上面我们已经将 ActionBar 隐藏起来了,接下来我们来看一下如何使用今天要学习的主角 ToolBar,看 ToolBar 如何来替代 ActionBar

二 、创建 ToolBar

现在我们来修改 activity_main.xml 中的代码,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolBar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
    
</RelativeLayout>

       这段代码不长,但里面却有不少技术点去仔细琢磨一下,首先看一下第三行,这里使用 xmlns:app 指定了一个新的命名空间,思考一下,这是由于每个布局文件都是用到 xmlns:android 来指定一个命名空间,因此我们才能一直使用 android:id、android:layout_width、android:layout_height 等写法,那么这里指定了 xmlns:app,也就是说可以使用 xmlns:attribute 这样的写法了,但是这里为什么要指定 xmlns:app 的命名空间呢,这是由于 Material Design 是在 Android 5.0 系统中才出现的,而很多的 Material 属性在 5.0 之前系统中国并不存在,那么为了能够兼容之前的老系统,我们就不能使用 android:attribute,而是使用 app:attribute

接下来定义了一个 Toolbar 控件,这个库是由 appcompat-v7 库提供的,这里给控件加一个 id,宽指定为 match_parent,高设置为 actionBar 的高度,背景色设置为 colorPrimary,这些都很好理解,接下来使用了 app:popupTheme 属性,可以单独将弹出的菜单项指定成浅色主题,之所以使用 app:popupTheme,是因为这个属性是 5.0 中新增的,我们使用 app:popupTheme 就可以兼容 5.0 以下的系统了

写完布局,接下来我们来修改 MainActivity 中的代码,如下所示:

/**
 * ToolBar 练习
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolBar);
        setSupportActionBar(toolbar);
    }
}

这里关键代码只有两句,主要就是通过调用 setSupportActionBar() 方法将 ToolBar 的实例传入,这样我们就做到了既使用 ToolBar,又让它的外观与功能和 ActionBar 一致了,运行一下程序,效果图如下:





这个标题栏我们就太熟悉了,虽然看上去和之前的标题栏没有两样,但它其实已经是 ToolBar 而不是 ActionBar 了,因此它现在也具备了实现 Material Design 效果的功能

接下来我们再看一下 ToolBar 常用的功能吧,比如修改标题栏上文字的颜色,以及显示文字的内容,如下:

修改标题栏颜色:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolBar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:titleTextColor="#f5f0f0" />
</RelativeLayout>

修改显示文字,这里给 Activity 增加了一个 android:label 属性,用于指定 ToolBar 中显示文字的内容,如果没有指定的话,会默认显示 application 中指定的 label 内容,也就是我们的应用名称,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.qiudengjiao.materialdesign">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="你好"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

只有一个标题的 ToolBar 看起来太单调了,我们接下来添加一些按钮,来让 ToolBar 更加丰富一些,这里我们直接拿系统自带的图标来显示,现在我们在 res 文件夹下创建一个 menu 文件夹,然后右击创建 toolbar.xml 文件,并编写如下代码:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/backup"
        android:icon="@mipmap/ic_launcher"
        android:title="Backup"
        app:showAsAction="always" />
    
    <item
        android:id="@+id/delete"
        android:icon="@mipmap/ic_launcher"
        android:title="Delete"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/setting"
        android:icon="@mipmap/ic_launcher"
        android:title="Setting"
        app:showAsAction="never" />

</menu>

可以看到,我们通过<item>标签来定义 action 按钮,这里我们就是要注意一下 app:showAsAction 的用法,这个主要是用来指定按钮显示的位置,之所以这里再次使用了 app 的命名空间,同样是为了能够兼容低版本的系统,showAsAction 主要有三种值可选:
  • always 表示永远显示在 ToolBar 中,如果屏膜空间不够则不显示
  • ifRoom 表示屏膜空间足够的情况下,显示在 ToolBar 中,不够的话就显示在菜单当中,
  • naver 则表示永远显示在菜单当中
注意:ToolBar 中的 action 按钮只会显示图标,菜单中的 action 按钮只会显示文字,接下来我们修改 MainActivity 中的代码,如下所示:

/**
 * ToolBar 练习
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolBar);
        setSupportActionBar(toolbar);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toolbar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.backup:
                Toast.makeText(this, "Click Backup", Toast.LENGTH_LONG).show();
                break;
            case R.id.delete:
                Toast.makeText(this, "Click Delete", Toast.LENGTH_LONG).show();
                break;
            case R.id.setting:
                Toast.makeText(this, "Click Setting", Toast.LENGTH_LONG).show();
                break;
            default:
        }
        return true;
    }
}


非常简单,我们在 onCreateOptionsMenu() 方法中加载了 toolbar.xml 这个菜单文件,然后再 onOptionsItemSelected() 方法中处理各个按钮的点击事件,现在重新运行一下程序:



可以看到,ToolBar 上面现在显示了两个 aciton 按钮,这是因为 Backup 指定的显示位置是 always,Delete 按钮指定的显示位置是 ifRoom,而现在屏幕的显示位置很充足,因此两个按钮都会显示在 ToolBar 中,另外一个 Setting 按钮由于指定的显示位置是 never 所以不会显示在 ToolBar 中,点击一下最右边的菜单按钮来展开菜单项,你就能找到 Setting 按钮了

当然我们还可以在xml文件中指定如下的内容:

  <android.support.v7.widget.Toolbar
        android:id="@+id/toolBar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/colorPrimary"
        app:logo="@mipmap/ic_launcher"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:subtitle="@string/app_name"
        app:subtitleTextColor="#c69aec"
        app:titleTextColor="#f5f0f0" />

例如用 app:logo 来指定 app 的图标,以及用 app:subtitle 来指定副标题,app:subtitleTextColor 来指定副标题的颜色等,效果如下:




好了 ToolBar 我们就写到这里了,当然 ToolBar 的功能远远比这里说的要多,大家慢慢来开发更强大的 ToolBar 吧,这里解析了最基础的也是最重要的 ToolBar 入门知识,如有错误请指正

声明:文章参考郭大神第一行代码




超详细版!Obsidian+Claude+Skills+云同步,打造智能 AI 知识库 本文介绍如何搭建高效的AI知识管理系统,将Obsidian笔记工具与ClaudeAI助手深度整合。通过ClaudeCode安装配置、ObsidianSkills插件添加和坚果云同步设置,实现本地存储安全性与云端便捷性的完美结合。该系统支持智能笔记整理、知识图谱可视化、智能搜索问答和内容创作辅助等功能,使静态笔记转变为能自动分析关联、处理复杂结构的"活"知识库。详细步骤包括工具准备、环境配置、插件安装和云同步设置 阅读详情

相关推荐

解密 vn.py 源码:从事件驱动到模块化设计的实战解析

本文深入解析vn.py源码,重点剖析其事件驱动机制与模块化设计。通过事件引擎、处理器字典等核心组件分析,展示如何实现低耦合高内聚的交易系统架构,并结合实战案例说明模块化设计带来的开发效率提升。文章还详细解读了Gateway抽象层、核心数据结构及设计模式应用,为量化交易开发者提供源码级实践指南。

weixin_27427619的博客 250

Android---Toolbar

使用 Toolbar 更好的代替 Actionbar。Toolbar 也可以很好的与 menu 结合设计出更炫酷大的UI。特别注意设置 Toolbar 的主题,可以单独设置

qq_44950283的博客 5253

OpenCompass实战:从零部署大模型评测平台,量化模型能力选型

在大模型技术选型与评估中,客观、可量化的评测体系是工程实践的关键。其核心原理在于通过标准化的数据集、统一的评测方法与自动化流程,将主观的模型体验转化为可比较的指标数据。这种评测框架的技术价值在于解决了模型能力评估的模糊性问题,为开发者提供了模型选型、效果对比与迭代优化的科学依据。典型的应用场景包括对比不同开源模型在代码生成、逻辑推理等特定任务上的性能,或是评估微调后模型在业务数据集上的提升效果。OpenCompass作为开源的大模型全能力评测平台,正是这一理念的工程化实现。它通过模块化的四层流水线架构和配置

weixin_28725037的博客 626

Android的ToolBar简单使用

文章目录一、前言二、Activity、FragmentActivity与ToolsBar的关系三、ToolsBar的初步使用四、ToolBar的菜单配置五、返回时间监听六、自定义ToolBar 一、前言 在实际开发中,通常会有应用操作栏,如果整个应用有一个统一风格的应用状态栏的话,我们常常会自己对其封装一个公共的组件在各个地方进行引入。不过官方对其提供栏一个公共状态栏的组件,并且拥有其一些常用的属性。以前是ActionBar,现在叫做ToolBar。而且还可以和一些其它的组件进行联动。这些组件在不满足其使用

Mr_Tony的专栏 1万+

射频工程师笔记---射频通信基础

回顾一下移动通信技术的发展,其实是互联网和通信技术的融合过程。在这个过程中,很多应用都在不断加入其中。比如计算机跟通信的融合产生了互联网、互联网跟手机的融合带来了移动互联网。手机可以看杂志、看视频、听音乐,于是又出现了内容服务产业;再后来,电视音箱等设备也能联网,于是网络跟家电又产生了融合。所以应用的出现总是在融合其他产业。在1995年,比尔·盖茨在《未来之路》一书中首次提出:在未来...

多年硬件从业经历,热爱学习,记录生活! 2万+

基于Arduino与Velostat的智能鞋垫:DIY足底压力监测系统全解析

压力传感器是物联网和健康监测领域的基础元件,其核心原理是将物理压力转换为可测量的电信号。通过压阻效应,材料的电阻值随压力变化,从而实现压力感知。这项技术为低成本、定制化的健康监测方案提供了可能,尤其在运动分析和康复训练中具有重要价值。本文聚焦于利用Velostat压敏材料和Arduino平台,详细解析如何从传感器制作、信号调理到无线数据传输,构建一套完整的足底压力监测系统。文中深入探讨了传感器阵列构建、信号滤波等关键技术,并针对常见问题提供了实用的解决方案,为创客和开发者实现可穿戴健康监测设备提供了清晰的工

weixin_32818781的博客 402

【Android】原来Toolbar还能这么用?Toolbar使用最全解析。网友:终于不用老是自定义标题栏啦

参考文章:Toolbar的使用

宾有为的博客 9374

零基础实战:用 Docker 和 vLLM 本地部署 bge-reranker-v2-m3 重排序模型

本文介绍了如何利用Docker容器和vLLM推理框架在本地部署BAAI开发的bge-reranker-v2-m3文本排序模型。

举世誉之而不加劝,举世非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。 5971

Android初步认识ToolBar

前言: ToolBar是ActionBar一种延伸的产物。尽管ActionBar是作为Activity不透明窗体装饰的一部分,但是ToolBar却可以放置在一个视图层的任意层中。应用也可以使用setActionBar() 方法指定ToolBar为ActionBar。 ToolBar比ActionBar有着更多值得人们关注的特性。从头到尾,一个ToolBar可能包含以下可选元素的一种组合

drinkingcode 963

uniapp:使用uni.request请求报错errMsg“:“request:fail abort statusCode:-1(uniApp使用uni.request向服务端接口发起请求失败报错)

解决request请求报错request:fail abort statusCode:-1,Uniapp打包到app后报错request:fail abort statusCode:-1,uniapp使用uni.request请求报错{“errMsg“:“request:fail abort statusCode:-1“}的解决办法,不是SSL证书问题,跳过ssl验证,解决https问题,Uniapp报错,小程序报错(含https解决方案)(真机预览问题)uni-app打包后不发请求的原因,uni-app真

✅ 精选推荐文章 3580

PINN:当深度学习遇上朗伯-比尔定律

光谱数据处理中引入PINN的三种架构设计

qq_53529450的博客 154

Android ToolBar 使用完全解析

ToolBar简介ToolBar是Android 5.0推出的一个新的导航控件用于取代之前的ActionBar,由于其高度的可定制性、灵活性、具有Material Design风格等优点,越来越多的应用也用上了ToolBar,比如常用的知乎软件其顶部导航栏正是使用ToolBar。官方考虑到仍有一部分用户的手机版本号低于5.0,所以,ToolBar也放进了support v7包内,使得低版本的系统也能

蓝天白云梦的csdn博客 3万+

SAP_FICO模块-资产减值功能对折旧和残值的影响

SAP_FICO模块-资产减值操作对资产历史折旧以及后续折旧的影响,包括减值操作的配置前提

风沙的博客 2805

【ToolBar】Android ToolBar之完全解析

原文地址:Toolbar:上位的小三 炮兵 镇楼 Toolbar是Android 5.0中新引入的一个控件,其出现的目的就是为了取代ActionBar,在讲解Toolbar之前我们还是来恶补一下关于ActionBar的一些野史,看看为什么Android会在5.0中使用一个全新的控件来取代它。 说起ActionBar相信大家都不陌生,Android在3.0的时候

滴水穿石,点石为金 2476

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Icarus-Android完全解析:从Toolbar到Popover的核心组件使用

Icarus-Android是一款专为安卓平台设计的富文本编辑器,虽然目前已暂停维护,但其核心组件Toolbar和Popover的设计理念与实现方式,仍对安卓富文本编辑开发具有重要参考价值。本文将深入解析这两大核心组件的使用方法,帮助开发者快速掌握Icarus-Android的精髓。 ## 核心组件概览:Icarus类的统筹作用 Icarus类作为整个富文本编辑器的核心控制器,负责协调Tool

gitblog_00439的博客 684

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

革命性滑动导航控制器:Navigation Toolbar Android 完全解析

Navigation Toolbar 是由 Ramotion 开发的一款基于 Kotlin 的滑动式 UI 导航控制器,专为 Android 应用打造。它以流畅的滑动交互和现代化的视觉设计,彻底改变了传统应用的导航体验,让用户在切换内容时获得如丝般顺滑的操作感受。 ## ✨ 为什么选择 Navigation Toolbar? 传统导航栏往往局限于固定位置的图标或文字,而 Navigation

gitblog_00921的博客 269

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

material design:Android ToolBar 使用完全解析

原文:https://blog.youkuaiyun.com/a553181867/article/details/51336899ToolBar简介ToolBar是Android 5.0推出的一个新的导航控件用于取代之前的ActionBar,由于其高度的可定制性、灵活性、具有Material Design风格等优点,越来越多的应用也用上了ToolBar,比如常用的知乎软件其顶部导航栏正是使用ToolBar。...

qq_25987491的博客 226

Android ToolBar 二

Android ToolBar 使用完全解析 标签: android导航设计Toolbaractionbar 2016-05-07 11:12 5096人阅读 评论(9) 收藏 举报  分类: Android(37)  版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] ToolBar简介

u012803067的博客 279
上一篇: Android 什么是 Material Design
下一篇: Android 用 DrawerLayout 和 NavigationView 实现侧滑菜单栏
QDJdeveloper
博客等级 码龄11年 108粉丝 49原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值