Actionbar入门(二)

2024-05-14 00:32
文章标签 入门 actionbar

本文主要是介绍Actionbar入门(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

常用方法

        setDisplayHomeAsUpEnabled():当前activity的icon(即左上角处的图标)左侧处出现返回图标。相当于getActionBar().setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP);

        setHomeAsUpIndicator():修改返回图标,但api18起。解决方法可参考修改返回图标。

        setCustomView():设置自定义actionbar,必须要设setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);否则无效。

        setDisplayShowCustomEnabled():是否可用自定义的layout做为actionbar。参数为true时对应的就是setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);。

        setDisplayShowHomeEnabled():是否显示actionbar左上角的icon/logo。true显示,false不显示。可以通过setIcon/setLogo()修改要显示的图标。

        setHomeButtonEnabled():左上角的icon/logo是否可点击。对应的id为android.R.id.home。

溢出菜单

        在别的一些应用中,经常看到在actionbar的最右边会出现一竖着排列的三个点(把有些功能选项给折叠起来了)里面放着一些操作选项,这被折叠起来的选项叫做溢出菜单(action overflow)。图如下:


        由于actionbar的长度是有限的。当空间不够时,如果手机没有物理菜单键,多余的action button(上图中有2)会自动收缩到action overflow(上图中的3)中。但是如果手机有物理菜单键,多余的菜单便不会出现action overflow。因此,需要在代码中关闭home键。

关闭home键

	public void closeMenu() {try {ViewConfiguration mconfig = ViewConfiguration.get(this);Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");if (menuKeyField != null) {menuKeyField.setAccessible(true);menuKeyField.setBoolean(mconfig, false);}} catch (Exception ex) {}}

        在上述的代码中是通过反射进行的,所以在某些手机上仍旧有可能无效。此时就需要自己模拟溢出菜单了。

模拟action overflow

        在一般情况下,一个actionbar只会显示三个action button。因此,我们可以把最后一个item里面放<menu>,这样点击第三个action button时就会弹出其中的<menu>。代码如:

<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:test="http://schemas.android.com/apk/res-auto" ><itemandroid:id="@+id/action1_item1_item1"test:actionViewClass="android.support.v7.widget.SearchView"test:showAsAction="always"/><itemandroid:id="@+id/action1_item1_item5"android:title="页4"test:showAsAction="ifRoom"></item><itemandroid:id="@+id/action1_item1_item7"android:icon="@drawable/abc_ic_menu_moreoverflow_normal_holo_light"test:showAsAction="ifRoom"><menu><itemandroid:id="@+id/action1_item1_item2"android:title="子页1"test:showAsAction="ifRoom"/><itemandroid:id="@+id/action1_item1_item3"android:title="子页2"test:showAsAction="ifRoom"/><itemandroid:id="@+id/action1_item1_item4"android:title="子页3"test:showAsAction="ifRoom"/></menu></item>
</menu>

        该布局的形成的actionbar效果为:最左边是一个放大镜(搜索功能),中间是一个"页4",最右边一个竖着排列的三个点,点开后便出现一个菜单,该菜单项有:子页1,子页2,子页3。

overflow显示icon

        默认时,overflow中的菜单是不显示图标的。也可以通过反射进行更改。如下:

	public boolean onMenuOpened(int featureId, Menu menu) {if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {if (menu.getClass().getSimpleName().equals("MenuBuilder")) {try {Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);m.setAccessible(true);m.invoke(menu, true);} catch (Exception e) {}}}return super.onMenuOpened(featureId, menu);}
        重写onMenuOpened(),并利用反射调用MenuBuilder中的setOptionalIconsVisible,并传入参数true。

style与Theme

总述

        actionbar的theme必须是Theme.Holo或者Theme.AppCompat(使用support包时的theme)的子类。
        对于theme,谷歌提供了"dark"与"light"两种风格。其中Theme.Holo与Theme.AppCompat是"dark"风格的,而Theme.Holo.Light与Theme.AppCompat.Light是"light"风格的。当然,还有一些别的,如:actionbar是dark,但别的部分是light的Theme.AppCompat.Light.DarkActionBar和Theme.Holo.Light.DarkActionBar。

使用

v7包中引用style 

<applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/Theme.AppCompat" >

系统3.0以上

    <applicationandroid:icon="@drawable/ic_launcher"android:label="demo"android:theme="@android:style/Theme.Holo.Light" >
        对比以上两者可以发现:v7包是直接@style,而下面的却是@android:style。其原因是前者定义在appcompat工程项目中的,因此在引用它的时候是直接@style/Theme.AppCompat,而后者是定义是系统中的
        有些时候需要自定义style,在自定义时一般都需要为style指定parent属性。这样我们就可以只更改其中某些属性,而不必把所有的属性都声明出来。

常用属性

在Theme.Holo中有一系列关于actionbar的设置。如下:
        actionBarSize:指定actionbar的高度。
        itemBackground:overflow中item的背景
        itemTextAppearance:overflow中item的字体样式,也即下图中“第四个”的样式。
        windowActionModeOverlay:指定actionbar是否处于overlay模式。
        actionBarStyle:actionbar的style,比较更改actionbar的背景等。
        actionButtonStyle:actionbar button的样式(figure1中的2),可以指定button点击时的背景
        actionOverflowButtonStyle:actionbar的overflow按钮(figure1的3)的style,可以用来更改overflow的按钮、背景等。
        actionBarItemBackground:api14以上。设置actionbutton与overflow button的背景。
        actionBarTabTextStyle:actionbar的标签的text样式
        actionMenuTextColor:当actionbutton显示文字时,该值用于指定文字的颜色。但它不影响overflow中的值。如下

修改actionbar背景

        我们需要重写android:actionBarStyle属性,并在该属性的值中修改android:background值。
3.0系统以上:
    <style name="AppBaseTheme" parent="@android:style/Theme.Holo"><item name="android:actionBarStyle">@style/CustomActionBarStyle</item></style><style name="CustomActionBarStyle" parent="@android:style/Widget.Holo.ActionBar"><item name="android:background">@drawable/action_bar_bg</item></style>
使用v7包:
<!-- 修改android:actionBarStyle属性,使其指向自定义的一个style --><style name="MyActionbar" parent="@style/Theme.AppCompat.Light"><!-- 在低版本中此处会报错,加上ignore属性忽略其报错即可。但是,此行不能不加,如果不加的话,在高版本上就没有效果了 --><item name="android:actionBarStyle" tools:ignore="NewApi">@style/MyStyle</item><!-- Support library compatibility --><item name="actionBarStyle">@style/MyStyle</item></style><!-- 为自定义的style指定一个parent,并且修改其中的android:background,该值就是actionbar的背景 --><style name="MyStyle" parent="@style/Widget.AppCompat.Light.ActionBar"><item name="android:background">@color/red</item><item name="background">@color/red</item></style>
        注意:必须得加上android:actionbarStyle属性,否则在高版本上就不会显示效果。而加上actionbarStyle是为了兼容低版本。
        通过上面的对比可以发现,用v7包和系统自带的不同之处在于:前者不但需要更改带android:前缀的属性,而且还需要更改不带前缀的属性,并且parent的值也不相同。
        在actionbarStyle中,还可以修改别的属性。下面是系统的一个actionbarStyle的值。
    <style name="Widget.Holo.ActionBar" parent="Widget.ActionBar"><item name="titleTextStyle">@style/TextAppearance.Holo.Widget.ActionBar.Title</item><item name="subtitleTextStyle">@style/TextAppearance.Holo.Widget.ActionBar.Subtitle</item><item name="background">@drawable/ab_transparent_dark_holo</item><item name="backgroundStacked">@drawable/ab_stacked_transparent_dark_holo</item><item name="backgroundSplit">@drawable/ab_bottom_transparent_dark_holo</item><item name="divider">?attr/dividerVertical</item><item name="progressBarStyle">@style/Widget.Holo.ProgressBar.Horizontal</item><item name="indeterminateProgressStyle">@style/Widget.Holo.ProgressBar</item><item name="progressBarPadding">32dip</item><item name="itemPadding">8dip</item></style>
        从中可以看出有titleTextStyle,也就是figure1中1右边的文字样式。因此,可以修改该属性从而更改相应的文字样式。如下:
    <style name="AppBaseTheme" parent="@android:style/Theme.Holo"><item name="android:actionBarStyle">@style/CustomActionBarStyle</item></style><style name="CustomActionBarStyle" parent="@android:style/Widget.Holo.ActionBar"><item name="android:background">@drawable/action_bar_overflow_bg_normal</item><item name="android:titleTextStyle">@style/CustomTitleTextStyle</item></style><!--该style会作为android:titleTextStyle的值。根据官方文档说法,该style的parent应该是TextAppearance.Holo.Widget.ActionBar.Title,但是该style要求api是14,为了兼容11,就将parent改成TextAppearance。--><style name="CustomTitleTextStyle" parent="@android:style/TextAppearance"><item name="android:textColor">#ff0000</item><item name="android:textSize">10sp</item></style>

修改action button点击背景

        在默认时,点击action button时背景颜色都会改变,但有时候系统自带的并不适合当前的整体效果,需要自己手动修改。如下:
    <style name="AppBaseTheme" parent="@android:style/Theme.Holo"><item name="android:actionButtonStyle">@style/CustomActionBarStyle</item></style><style name="CustomActionBarStyle" parent="@android:style/Widget.Holo.ActionButton"><!-- 设置为selector,点击时可以切换成自己想要的背景 --><item name="android:background">@drawable/selector_action_bar_overflow_bg</item></style>

修改overflow图标及点击背景

    <style name="AppBaseTheme" parent="@android:style/Theme.Holo"><item name="android:actionOverflowButtonStyle">@style/CustomActionBarStyle</item></style><style name="CustomActionBarStyle" parent="@android:style/Widget.Holo.ActionButton.Overflow"><!-- overflow的图片 --><item name="android:src">@drawable/overflow</item><!-- overflow的背景,可以设置为selector。点击时可以切换成自己想要的背景 --><item name="android:background">@drawable/selector_action_bar_overflow_bg</item></style>

修改tab中文字样式

        actionbar  tab首先要修改android:actionBarTabTextStyle的值,最后修改该style中的android:textColor的值。
<!-- 应用到清单文件中的style --><style name="MyActionbar" parent="@android:style/Theme.Holo.Light"><item name="android:actionBarTabTextStyle">@style/MyActionBarTabText</item></style><style name="MyActionBarTabText" parent="@android:style/Widget.Holo.ActionBar"><item name="android:textColor">@android:color/white</item></style>
        其中系统的一个style为:
    <style name="Widget.Holo.ActionBar.TabText" parent="Widget.ActionBar.TabText"><item name="textAppearance">@style/TextAppearance.Holo.Medium</item><item name="textColor">?attr/textColorPrimary</item><item name="textSize">12sp</item><item name="textStyle">bold</item><item name="textAllCaps">true</item><item name="ellipsize">marquee</item><item name="maxLines">2</item></style>

示例

        仿微信的actionbar,具体的style文件如下:
<style name="AppBaseTheme" parent="@android:style/Theme.Holo"><item name="android:actionBarStyle">@style/CustomActionBarStyle</item><item name="android:itemBackground">@drawable/selector_action_bar_overflow_item_bg</item><item name="android:itemTextAppearance">@style/CustomItemTextAppearance</item><item name="android:actionButtonStyle">@style/CustomActionButtonStyle</item><item name="android:actionOverflowButtonStyle">@style/CustomActionOverflowButtonStyle</item></style><style name="CustomActionBarStyle" parent="@android:style/Widget.Holo.ActionBar"><item name="android:background">@drawable/action_bar_bg</item><item name="android:titleTextStyle">@style/CustomABTitleTextStyle</item></style><style name="CustomABTitleTextStyle" parent="@android:style/TextAppearance"><item name="android:textColor">#dddddd</item><item name="android:textSize">20sp</item></style><style name="CustomActionButtonStyle" parent="@android:style/Widget.Holo.ActionButton"><item name="android:background">@drawable/selector_action_bar_overflow_item_bg</item></style><style name="CustomActionOverflowButtonStyle" parent="@android:style/Widget.Holo.ActionButton.Overflow"><item name="android:background">@drawable/selector_action_bar_overflow_button_bg</item><item name="android:src">@drawable/overflow</item></style><style name="CustomItemTextAppearance" parent="@android:style/TextAppearance"><item name="android:textColor">#ff0000</item><item name="android:textSize">20sp</item></style>
效果如下:



这篇关于Actionbar入门(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987245

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python FastAPI入门安装使用

《PythonFastAPI入门安装使用》FastAPI是一个现代、快速的PythonWeb框架,用于构建API,它基于Python3.6+的类型提示特性,使得代码更加简洁且易于绶护,这篇文章主要介... 目录第一节:FastAPI入门一、FastAPI框架介绍什么是ASGI服务(WSGI)二、FastAP

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非