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://www.rhkb.cn/news/113856.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】指针 和 数组 笔试题详解

目录 一、数组 1.一维数组 2.字符数组 3.二维数组 二、指针 笔试题1 笔试题2 笔试题3 笔试题4 笔试题5 笔试题6 笔试题7 笔试题8&#xff08;有难度&#xff09;【看明白会有质的收获】 在这里我们需要先了解数组名的意义 sizeof(数组名) &#xff0c;这里的数组名表示…

《用行动打造满意的服务》考试答案

中电金信新员工入职培训选修课程《用行动打造满意的服务》考试答案

Mysql高级语句

高级语句 1.按关键字排序 SELECT column1, column2, ... FROM table_name ORDER BY column1, column2, ... ASC|DESC ASC 是按照升序进行排序的&#xff0c;是默认的排序方式&#xff0c;即 ASC 可以省略。 SELECT 语句中如果没有指定具体的排序方式&#xff0c;则默认按 ASC…

[论文笔记]DSSM

引言 这是DSSM论文的阅读笔记,后续会有一篇文章来复现它并在中文数据集上验证效果。 本文的标题翻译过来就是利用点击数据学习网页搜索中深层结构化语义模型,这篇论文被归类为信息检索,但也可以用来做文本匹配。 这是一篇经典的工作,在DSSM之前,通常使用传统机器学习的…

Java“魂牵”京东商品详情描述数据,京东商品详情API接口,京东API接口申请指南

要通过京东的API获取商品详情描述数据&#xff0c;您可以使用京东开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例&#xff0c;展示如何通过京东开放平台API获取商品详情&#xff1a; 首先&#xff0c;确保您已注册成为京东开放平台的开发者&#xff0c;并创…

ACM模式数组构建二叉树Go语言实现

目的 想输入一个数组&#xff0c;然后构造二叉树 例如数组为[6, 2, 8, 0, 4, 7, 9, -1, -1, 3, 5] 对应的二叉树为&#xff1a; 参考资料 ACM模式数组构建二叉树 重点&#xff1a;如果父节点的数组下标是i&#xff0c;那么它的左孩子下标就是i*21&#xff0c;右孩子下标就是…

持续加码,科士达重仓储能!

储能的热度&#xff0c;如温度计一样真实展现在各种数据榜单上&#xff1a;新注册企业的数量&#xff0c;转型跨界的企业&#xff0c;尤其IPO募资扩产规模&#xff0c;更是成为了储能企业竞赛的新标准。 日前&#xff0c;科士达一则新的定向募资预案&#xff0c;吸引了业内广泛…

C++-list实现相关细节和问题

前言&#xff1a;C中的最后一个容器就是list&#xff0c;list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指…

模块化与组件化:开发中的双剑合璧

引言&#xff1a;模块化与组件化的重要性 在现代软件开发中&#xff0c;随着项目规模的增长和技术的复杂性增加&#xff0c;如何有效地组织和管理代码变得越来越重要。模块化与组件化作为两种主要的代码组织方法&#xff0c;为开发者提供了有效的工具&#xff0c;帮助他们创建…

three.js(十):线性几何体

线性几何体 WireframeGeometry 网格几何体EdgesGeometry 边缘几何体 WireframeGeometry 网格几何体 WireframeGeometry( geometry : BufferGeometry ) geometry — 任意几何体对象。 const geometry new SphereGeometry(); const wireframe new WireframeGeometry(geometr…

Unity RenderStreaming 云渲染-黑屏

&#x1f96a;云渲染-黑屏 网页加载出来了&#xff0c;点击播放黑屏 &#xff0c;关闭防火墙即可&#xff01;&#xff01;&#xff01;&#xff01;

正则表达式学习笔记

正则表达式学习笔记 常用正则表达式 1、匹配字母 Pattern patternPattern.compile("[a-zA-Z]"); 2、匹配数字 Pattern patternPattern.compile("[0-9]"); 3、匹配字母和数字 Pattern patternPattern.compile("([0-9])|([a-zA-Z])")…

C语言(第三十天)

1. 什么是bug bug本意是昆虫”或“虫子”&#xff0c;现在一般是指在电脑系统或程序中&#xff0c;隐藏着的一些未被发现的缺陷或问 题&#xff0c;简称程序漏洞。 “Bug” 的创始人格蕾丝赫柏&#xff08;Grace Murray Hopper&#xff09;&#xff0c;她是一位为美国海军工作的…

Web网站服务器

目录 一、什么是Apache? 二、虚拟目录是什么&#xff1f; 三、Apcahe相关配置文件 四、httpd.conf主配置文件的常用配置参数 五、Web网站配置案例 5.1搭建基于用户的个人主页网站 5.2、配置虚拟目录 5.3、配置虚拟主机 5.3.1搭建两个基于IP地址的虚拟主机 5.3.2搭建两个基于域…

执行公开网数据采集-技术人员撤退

首先逼逼&#xff0c;此贴仅为秀肌肉&#xff0c;技术人员想学习的话可以绕道了 打开控制台&#xff0c;看cookie&#xff0c;ST&#xff0c;某数 第一个请求412&#xff0c;看VM 然后就是替换js&#xff0c;hook&#xff0c;之类的&#xff0c;扣代码流程&#xff0c;此处省…

无涯教程-Android - Intents/Filters

Android Intent 是要执行的操作的抽象描述。它可以与 startActivity 一起启动Activity&#xff0c;将 broadcastIntent 发送给任何BroadcastReceiver组件&#xff0c;并与 startService(Intent)或 bindService(Intent&#xff0c;ServiceConnection&#xff0c;int)与后台服务进…

游戏报错xinput1_3.dll丢失的解决方法,xinput1_3.dll修复步骤

今天&#xff0c;我将和大家探讨一个与我们日常生活息息相关的话题——电脑丢失xinput1_3.dll文件怎么办。作为一位老师&#xff0c;我深知电脑技术对于现代人的重要性&#xff0c;而xinput1_3.dll文件的丢失则是许多电脑用户在游戏、办公等方面遇到的问题。因此&#xff0c;我…

Apipost:为什么是开发者首选的API调试工具

文章目录 前言正文接口调试接口公共参数、环境全局参数的使用快速生成并导出接口文档研发协作接口压测和自动化测试结论 前言 Apipost是一款支持 RESTful API、SOAP API、GraphQL API等多种API类型&#xff0c;支持 HTTPS、WebSocket、gRPC多种通信协议的API调试工具。除此之外…

华为OD机试 - 硬件产品销售方案 - 回溯(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、补充说明五、解题思路六、Java算法源码七、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;…