Android学习之路(11) ActionBar与ToolBar的使用

自android5.0开始,AppCompatActivity代替ActionBarActivity,而且ToolBar也代替了ActionBar,下面就是ActionBar和ToolBar的使用

ActionBar

1、截图

2、使用

2.1、AppCompatActivity和其对应的Theme

  • AppCompatActivity使用的是v7的ActionBar(和默认的ActionBar使用起来略有区别,一会代码中会有体现)
  • Theme的话继承于Theme.AppCompat.Light.DarkActionBar,系统提供的深色系的actionbar,那么按钮,文字,和菜单是白色的
//Activity
public class ActionBarActivity extends AppCompatActivity//style
<!--默认所有activity的actionbar的theme--><style name="AppCompatActivity_ActionBarTheme" parent="Theme.AppCompat.Light.DarkActionBar"><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><item name="android:textAllCaps">false</item>
</style>

2.2、ActionBar的使用

  • 获取actionbar:

这里的v7的是getSupportActionBar(),默认的是getActionBar()

//AppCompatActivity use v7 action bar
actionBar = this.getSupportActionBar();
//Activity use action bar
//actionBar = this.getActionBar();if(actionBar == null){return;
}
  • 设置主副标题
//主标题
actionBar.setTitle("ActionBar Title");
//副标题
actionBar.setSubtitle("Sub Title");
  • 设置navigation up按钮:可见+可用+

但是如果有menu复写onOptionsItemSelected函数的话,则onSupportNavigateUp无用将不会被调用。

//左侧按钮:可见+可用+更换图标
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
//actionBar.setHomeAsUpIndicator(R.mipmap.back_white);
  • 设置navigation up按钮的监听:复写onSupportNavigateUp(),
/*** 复写:左侧按钮点击动作* android.R.id.home* v7 actionbar back event* 注意:如果复写了onOptionsItemSelected方法,则onSupportNavigateUp无用**/
@Override
public boolean onSupportNavigateUp() {finish();return super.onSupportNavigateUp();
}/*** 复写:左侧按钮点击动作* android.R.id.home* actionbar back event* 注意:如果复写了onOptionsItemSelected方法,则onSupportNavigateUp无用
@Override
public boolean onNavigateUp() {finish();return super.onNavigateUp();
}**/
  • 设置logo(icon等):用logo代替icon,不知道为什么不灵??
//设置logo
actionBar.setLogo(android.R.mipmap.sym_def_app_icon);
actionBar.setDisplayUseLogoEnabled(true);
//设置icon:use logo instead of an icon
//actionBar.setIcon(R.mipmap.ic_launcher);
  • 设置菜单menu和对应监听:android.R.id.home就是左侧的navigation up按钮
/*** 复写:添加菜单布局* */
@Override
public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu, menu);return true;
}/*** 复写:设置菜单监听* */
@Override
public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {//actionbar navigation up 按钮case android.R.id.home:finish();break;case R.id.action_refresh:Toast.makeText(this, "Refresh selected", Toast.LENGTH_SHORT).show();break;case R.id.action_add:Toast.makeText(this, "Add selected", Toast.LENGTH_SHORT).show();break;case R.id.action_settings:Toast.makeText(this, "Settings selected", Toast.LENGTH_SHORT).show();break;default:break;}return true;
}

设置tab和对应监听

//增加actionbar 下面的tab按钮
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.addTab(actionBar.newTab().setText("Tab 1").setTabListener(new ActionBar.TabListener() {@Overridepublic void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {Toast.makeText(ActionBarActivity.this, "Tab 1 select",Toast.LENGTH_SHORT).show();}@Overridepublic void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }@Overridepublic void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
}));
actionBar.addTab(actionBar.newTab().setText("Tab 2").setTabListener(new ActionBar.TabListener() {@Overridepublic void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {Toast.makeText(ActionBarActivity.this, "Tab 2 select",Toast.LENGTH_SHORT).show();}@Overridepublic void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }@Overridepublic void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
}));
  • 或者完全自定义
//自定义
actionBar.setCustomView(R.layout.actionbar_title);
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
  • 隐藏、显示actionbar
case R.id.btn_hide:if(actionBar != null){/*** 隐藏actionbar* 1、有actionbar情况下:actionBar.hide();* 2、直接使用Theme.Holo.NoActionBar* 3、theme中添加属性*      <item name="windowActionBar">false</item>*      <item name="windowNoTitle">true</item>* 4、在setContent之前 Window feature must be requested before adding content*    AppCompatActivity: supportRequestWindowFeature(Window.FEATURE_NO_TITLE),*    Activity: requestWindowFeature(Window.FEATURE_NO_TITLE);** */actionBar.hide();}break;case R.id.btn_show:if(actionBar != null){actionBar.show();}break;

Menu(共通的菜单,不细说)

1、showAsAction属性

  • always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示
  • ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中
  • never则表示永远显示在overflow中
  • withText:这个值使菜单项和它的图标,文本一起显示

2、布局

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:android="http://schemas.android.com/apk/res/android"><!--showAsAction属性always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中never则表示永远显示在overflow中withText:这个值使菜单项和它的图标,文本一起显示--><!--menuCategory:同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。--><!--orderInCategor:同种类菜单的排列顺序。该属性需要设置一个整数值--><itemandroid:id="@+id/action_refresh"android:icon="@mipmap/refresh"android:title="Refresh"app:showAsAction="always" /><itemandroid:id="@+id/action_add"android:icon="@mipmap/add"android:title="Add"app:showAsAction="ifRoom" /><itemandroid:id="@+id/action_settings"android:icon="@mipmap/settings"android:title="Settings"app:showAsAction="never"></item>
</menu>

ToolBar

了解了ActionBar的话,那么ToolBar和其差不多,更加强大,更加符合MD风格,然后就代替ActionBar,使用起来差不多,但是又UI上的坑

1、截图:颜色不正常的

2、使用

2.1、隐藏ActionBar有4中方式

1、如果继承了theme有actionbar的则,在setContentView方法之前设置:v7的supportRequestWindowFeature(Window.FEATURE_NO_TITLE);或者非v7的requestWindowFeature(Window.FEATURE_NO_TITLE);
2、theme直接继承没有actionbar的,比如说:Theme.AppCompat.Light.NoActionBar
3、theme中没设置属性没有actionbar:false
true
4、actionBar.hide();

2.2、AppCompatActivity和其对应的Theme

//activity
public class ToolBarActivity extends AppCompatActivity//style<!--默认所有activity的toolbar的theme--><!--<style name="AppCompatActivity_ToolBarTheme" parent="Theme.AppCompat.Light.NoActionBar">--><style name="AppCompatActivity_ToolBarTheme" parent="Theme.AppCompat.Light"><!--不要actionbar,不要title--><item name="windowActionBar">false</item><item name="windowNoTitle">true</item><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><item name="android:textAllCaps">false</item></style>

ToolBar的使用

  • toolbar在layout中布局代码:

这里面有UI的坑,就是深色toolbar,文字也是黑色的。

<!--这里是代替actionbar的,当然可以设置在baseactivity中通用,然后include进来--><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:background="?attr/colorPrimary"android:layout_height="wrap_content"android:minHeight="?attr/actionBarSize"></android.support.v7.widget.Toolbar>
  • 获取toolbar并取代actionbar,这里设置toolbar的标题必须在setSupportActionBar之前,否则无用
       //隐藏默认actionbarActionBar actionBar = getSupportActionBar();if(actionBar != null){actionBar.hide();}//获取toolbartoolBar = findViewById(R.id.toolbar);//主标题,必须在setSupportActionBar之前设置,否则无效,如果放在其他位置,则直接setTitle即可toolBar.setTitle("ToolBar Title");//用toolbar替换actionbarsetSupportActionBar(toolBar
  • 设置副标题
        //副标题+颜色toolBar.setSubtitle("Sub Title");
  • 设置navigation up按钮的图标和点击监听
        //左侧按钮:可见+更换图标+点击监听getSupportActionBar().setDisplayHomeAsUpEnabled(true);//显示toolbar的返回按钮//toolBar.setNavigationIcon(R.mipmap.back_white);toolBar.setNavigationOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();}});
  • 设置logo
        //设置logotoolBar.setLogo(android.R.mipmap.sym_def_app_icon); 
  • 设置菜单menu及其监听
/*** 复写:添加菜单布局* */@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu, menu);return true;}/*** 复写:设置菜单监听* */@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.action_refresh:Toast.makeText(this, "Refresh selected", Toast.LENGTH_SHORT).show();break;case R.id.action_add:Toast.makeText(this, "Add selected", Toast.LENGTH_SHORT).show();break;case R.id.action_settings:Toast.makeText(this, "Settings selected", Toast.LENGTH_SHORT).show();break;default:break;}return true;}
  • 加载自定义toolbar:直接在toolbar的layout中写即可,可以是文字居中等等
  • 隐藏、显示toolbar
case R.id.btn_hide:if(toolBar != null){toolBar.setVisibility(View.GONE);}break;case R.id.btn_show:if(toolBar != null){toolBar.setVisibility(View.VISIBLE);}break;

3、截图:颜色正常的

4、用ToolBar 的Theme和PopupTheme来控制颜色正常,或自定义颜色

4.1、ToolBar显然颜色不对

那找找为啥ActionBar的时候对的,直觉告诉我是theme的问题,于是找Theme.AppCompat.Light.DarkActionBar,点击进去看会看到

  • actionBarPopupThem是Light的,就是menu菜单点击弹出那个
  • actionBarTheme是深色系的,那么控制按钮图标和主副标题颜色就是白色的
<style name="Base.Theme.AppCompat.Light.DarkActionBar" parent="Base.Theme.AppCompat.Light"><item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item><item name="actionBarWidgetTheme">@null</item><item name="actionBarTheme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item><!-- Panel attributes --><item name="listChoiceBackgroundIndicator">@drawable/abc_list_selector_holo_dark</item><item name="colorPrimaryDark">@color/primary_dark_material_dark</item><item name="colorPrimary">@color/primary_material_dark</item>
</style>

4.2、新建Toolbar的theme和popuptheme

这里面就是继承刚刚找到的东西,当然也可以再自定义颜色咯

    <!--给toolbar单独设置的theme,让toolbar上按钮颜和文字颜色变化的--><style name="MyDarkToolBarTheme" parent="ThemeOverlay.AppCompat.Dark.ActionBar"><!--toolbar图标颜色--><!--<item name="colorControlNormal">@color/colorAccent</item>--><!--toolbar的title颜色--><!--<item name="android:textColorPrimary">@color/colorAccent</item>--><!--toolbar的subtitle颜色--><!--<item name="subtitleTextColor">@color/colorAccent</item>--></style><!--给toolbar的menu内单独设置的theme,让toolbar上按钮颜和文字颜色变化的--><style name="MyLightPopupTheme" parent="ThemeOverlay.AppCompat.Light"><!--设置背景--><!--<item name="android:background">@android:color/white</item>--><!--设置字体颜色--><!--<item name="android:textColor">@color/colorAccent</item>--><!--设置不覆盖锚点--><!--<item name="overlapAnchor">false</item>--></style>

4.3、添加Toolbar的theme和popuptheme

//需添加
xmlns:app="http://schemas.android.com/apk/res-auto"<!--这里是代替actionbar的,当然可以设置在baseactivity中通用,然后include进来--><android.support.v7.widget.Toolbar省略...app:theme="@style/MyDarkToolBarTheme"app:popupTheme="@style/MyLightPopupTheme"></android.support.v7.widget.Toolbar>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621561.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

十六、pikachu之SSRF

文章目录 1、SSRF概述2、SSRF&#xff08;URL&#xff09;3、SSRF&#xff08;file_get_content&#xff09; 1、SSRF概述 SSRF(Server-Side Request Forgery&#xff1a;服务器端请求伪造)&#xff1a;其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能&…

基于体素形态学测量分析(VBM)的工具包比较及其在年龄预测中的应用

摘要 基于体素的形态学测量分析(VBM)通常用于灰质体积(GMV)的局部量化。目前存在多种实现VBM的方法。然而&#xff0c;如何比较这些方法及其在应用中的效用(例如对年龄效应的估计)仍不清楚。这会使研究人员疑惑他们应该在其项目中使用哪种VBM工具包。本研究以用户为中心&#…

使用MV制作最简单的游戏:我要做游戏(4)

公众号原文 本期将设计游戏中基本,也是核心的数值元素。不想循规蹈矩的朋友也可自行回顾前三期的内容: 我要做游戏(1) 我要做游戏(2) 我要做游戏(3) 呃,说道数值,可能一些人脑海里觉得它是这样的: 这么想其实也没错啦,不过实际游戏设计中,攻击力与防御力只是…

On-Manifold Optimization: Local Parameterization

Overview Manifold Space vs Tangent Space Jacobian w.r.t Error State Jacobian w.r.t Error State vs True State According 1 2.4, The idea is that for a x ∈ N x \in N x∈N the function g ( δ ) : f ( x ⊞ δ ) g(\delta) : f (x \boxplus \delta) g(δ):f(x…

DeforGAN:用GAN实现星际争霸开全图外挂!

点击上方“机器学习与生成对抗网络”&#xff0c;关注"星标" 获取有趣、好玩的前沿干货&#xff01; 文章来源&#xff1a;机器之心 作者&#xff1a;Yonghyun Jeong等 参与&#xff1a;李诗萌、Geek AI 对于广大星际争霸迷来说&#xff0c;地图全开作弊代码「Black …

局域网联机_七日杀v17.2(B27)版/支持局域网联机/多项修改器/初始存档/局域网联机教程...

点击蓝字关注我们&#xff0c;每日提供优质游戏 游戏介绍 那时地球表面已经变成废墟&#xff0c;更糟的是&#xff0c;没有人知道到底是因为辐射、生化武器还是天灾&#xff0c;导致地面上出现了一群僵尸。玩家将扮演在美国亚历桑纳地区的一名幸存者&#xff0c;那里是地球最后…

魔兽争霸 / 星际争霸 无法使用 CTRL + 1 进行编队

打游戏时发现不好编队&#xff0c; 应该是快捷键冲突导致。 查了一下&#xff0c;是输入法的问题。 目前用的QQ五笔输入法里用到了 CTRL 1&#xff0c;所以在游戏里就用不了了。 如下面所示&#xff0c;把最后的 CTRL 1 的复选框勾掉就可以了。

DeepMind《星际争霸2》AI碾压人类遭Gary Marcus猛怼:通用智能就是空谈

来源&#xff1a;新智元 本文 3635 字 &#xff0c;建议阅读 10分钟 。 本文介绍了Marcus对AI碾压人类以及未来通用智能研究意义的质疑。 针对DeepMind前几日发布的《星际争霸2》智能体AlphaStar进化版&#xff0c;他在Twitter再次提出了自己的质疑。不过这次&#xff0c;Marcu…

星际2数据编辑器

转自&#xff1a;https://blog.csdn.net/xoyojank/article/details/8122886 只列了技能的划分&#xff0c;其余的参考链接 对象类型 星际2就对象有很多类型, 这里只说一下比较常见的. 这些类型还有子类型, 对象的实例之间是可以进行数据拷贝和派生的. Units(单位) 大多数人应…

nodejs里面的event loop

1. event loop 1.1 什么是event-loop js的标准文档定义如下 https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop#event_loop https://javascript.info/event-loop html的标准定义 https://html.spec.whatwg.org/multipage/webappapis.html#event-loop-proc…

chatgpt赋能python:如何用Python编写炒股软件

如何用Python编写炒股软件 随着股票投资的普及和互联网技术的发展&#xff0c;越来越多的人开始尝试使用计算机辅助炒股&#xff0c;以获取更好的投资回报。Python作为一种简单易学、高效实用的编程语言&#xff0c;受到了众多股票投资者的青睐。本文将介绍如何用Python编写炒…

单例模式:保证一个类仅有一个实例

单例模式&#xff1a;保证一个类仅有一个实例 欢迎来到设计模式系列的第二篇文章&#xff01;在上一篇中&#xff0c;我们已经对设计模式有了初步的了解&#xff0c;今天让我们深入研究第一个模式——单例模式。 什么是单例模式&#xff1f; 在软件开发中&#xff0c;我们经…

RabbitMQ从原理到实战—基于Golang【万字详解】

文章目录 前言一、MQ是什么&#xff1f;优势劣势 二、MQ的用途1、应用解耦2、异步加速3、削峰填谷4、消息分发 三、RabbitMQ是什么1、AMQP 协议2、RabbitMQ 包含的要素3、RabbitMQ 基础架构 四、实战1、Simple模式(即最简单的收发模式)2、Work Queues 模型3、Publish/Subscribe…

lnmp架构-mysql

1.MySQL数据库编译 make完之后是这样的 mysql 初始化 所有这种默认不在系统环境中的路径里 就这样加 这样就可以直接调用 不用输入路径调用 2.初始化 重置密码 3.mysql主从复制 配置master 配置slave 当master 端中还没有插入数据时 在server2 上配slave 此时master 还没进…

Tornado服务器连接数据库

环境 python3.6.1 vscode mysql navicat 安装需要的包 pip install torndb_for_python3 pip install pymysql0.8.0 #请安装pymysql的0.8.0版本&#xff0c;否则可能出现一个FLAG不存在的bug。亲测0.8.0可用。 tornadb不适用于python3&#xff0c;torndb_for_python3 是修改过的…

Tornado框架入门教程

Tornado框架入门教程 Tornado在知乎广为使用&#xff0c;当你用Chrome打开网页版本的知乎&#xff0c;使用开发者工具仔细观察Network里面的请求&#xff0c;就会发现有一个特别的状态码为101的请求&#xff0c;它是用浏览器的websocket技术和后端服务器建立了长连接用来接收服…

Tornado自定义路由

默认路由规则 代码 由下述代码可知&#xff0c;路由规则都在放在 tornado.web.Application 中&#xff0c;强迫症的我看着不舒服不说&#xff0c;而且如果有多级路由的话就很难搞了&#xff0c;比如说用户模块、不同视图模块等等&#xff0c;前一级路由是固定的&#xff0c;后…

Tornado重定向(三)

为什么需要重定向呢&#xff1f;比较常见的就是当网站内部结构变动&#xff0c;如栏目、网址等等的变动就需要进行301重定向&#xff0c;还有内部一些错误的页面也可以做301重定向&#xff0c;提高用户体验。当因网站内部结构变动&#xff0c;需要删除网站中的某些目录时&#…

Tornado介绍

文章目录 特点结构Tornado实现异步原理模块Tornado服务器的三个底层核心模块设计模型 Tornado龙卷风是一个开源的网络服务器框架&#xff0c;它是基于社交聚合网站FriendFeed的实时信息服务开发而来的 Tornado是使用Python编写的Web服务器兼Web应用框架与主流Web服务器框架不同…

Tornado初见(一)

在之前的其他博客中介绍了Django&#xff0c;这里介绍一下Tornado。两者的区别可以总结为&#xff1a; django大而全&#xff0c;适合小型的压力不大的项目&#xff0c;一旦压力上来其是扛不住的&#xff0c;毕竟一是太重&#xff0c;而是非异步。 但是好处就是什么都有&#…