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 WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

解析C++11 static_assert及与Boost库的关联从入门到精通

《解析C++11static_assert及与Boost库的关联从入门到精通》static_assert是C++中强大的编译时验证工具,它能够在编译阶段拦截不符合预期的类型或值,增强代码的健壮性,通... 目录一、背景知识:传统断言方法的局限性1.1 assert宏1.2 #error指令1.3 第三方解决

从入门到精通MySQL 数据库索引(实战案例)

《从入门到精通MySQL数据库索引(实战案例)》索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或... 目录一、索引是什么?能干嘛?核心作用:二、索引的 4 种主要类型(附通俗例子)1. BTree 索引(

Redis 配置文件使用建议redis.conf 从入门到实战

《Redis配置文件使用建议redis.conf从入门到实战》Redis配置方式包括配置文件、命令行参数、运行时CONFIG命令,支持动态修改参数及持久化,常用项涉及端口、绑定、内存策略等,版本8... 目录一、Redis.conf 是什么?二、命令行方式传参(适用于测试)三、运行时动态修改配置(不重启服务

MySQL DQL从入门到精通

《MySQLDQL从入门到精通》通过DQL,我们可以从数据库中检索出所需的数据,进行各种复杂的数据分析和处理,本文将深入探讨MySQLDQL的各个方面,帮助你全面掌握这一重要技能,感兴趣的朋友跟随小... 目录一、DQL 基础:SELECT 语句入门二、数据过滤:WHERE 子句的使用三、结果排序:ORDE