Android之Action Bar
Action Bar在实际应用中,很好地为用户提供了导航,窗口位置标识,操作点击等功能。它出现于Android3.0(API 11)之后的版本中,在2.1之后的版本中也可以使用。
添加与隐藏Action Bar
在3.0之后的版本中(android:minSdkVersion 或者 android:targetSdkVersion 属性被设置成11或者更高),默认在activity中添加了Action Bar,不用额外添加。如果不想在activity中使用Action Bar,我们可以通过设定activity的主题来实现。
在程序运行过程中,也可以动态隐藏或者显示Action Bar:
动态显示或隐藏将引起当前的activity界面重绘。如果需要频繁的显示或隐藏,可以使用overlay模式,将一个action bar固定在当前activity界面上方,无论显示或隐藏都不会使activity界面重绘。
为Action Bar添加Item
action bar上通常放置着最常用的item便于用户进行操作,那些不重要的item会被隐藏于overflow 的item中。Item通常被预定义于menu资源文件中,如下:
当一个activity启动后,在onCreateOptionsMenu()方法来填充ab中预设的item。
在item的showAsAction属性中,选项含义如下:
- never:永远不会显示。只会在溢出列表中显示。
- ifRoom:会显示在Item中,但是如果已经有4个或者4个以上的Item时会隐藏在溢出列表中。
- always:无论是否溢出,总会显示。
- withText:Title会显示。
- collapseActionView:可拓展的Item。
处理item事件
当用户触发item的点击事件后,通过 onOptionsItemSelected() 方法来处理事件,如下:
通过APP图标返回上一层
单击app图标回退上一层功能与单击back返回按钮是完全不同的两个功能,后者是根据时间的顺序,向后返回到上一个用户操作界面,而不是根据app的层次结构返回。
启用向上一层返回功能,需要调用 setDisplayHomeAsUpEnabled()方法:
除此之外,我们还需要指定向上返回到哪个activity,根据不同情况有两种方式:
当前activity有唯一的父activity A,即能从A这个activity跳转到当前的activity,那么可以通过在manifest文件中指定父activity:
如果有多个父activity,则通过复写getSupportParentActivityIntent() 和onCreateSupportNavigateUpTaskStack()方法来指定要回到哪个activity。
当用户在同一个app的若干层activity中进行操作时,单击UP进行回退,此时系统会调用getSupportParentActivityIntent()方法。由于可能存在多个父activity,在此方法中可以返回一个启动父activity的Intent。
当用户在进行跨app的多层activity中进行操作时,单击UP进行回退,系统会调用onCreateSupportNavigateUpTaskStack()方法。此时,需要将TaskStackBuilder 传递给该方法,构造相应的回退栈。
即使复写了getSupportParentActivityIntent()方法来指定在本app中回退的操作后,并不是一定要复写onCreateSupportNavigateUpTaskStack()方法,通过在manifest文件中指定默认activity即可。
添加Action View
在action bar上添加action view这种小插件,可以帮助用户在不改变当前activity或fragment的情况下完成一些功能,例如搜索等等。
通过在menu文件的item中声明actionLayout 或actionViewClass属性来指定需要使用的布局文件或者类,例如添加一个搜索控件:
在menu文件中添加完成后,可以在onCreateOptionsMenu()方法中获取并配置该action view:
通过将获取到的menuItem项传递给getActionView方法取得该action view,如果在11版本之上,则直接调用getActionView即可:
通过指定collapseActionView属性可以让action view折叠起来,单击后又会出现,此时系统会自动回调onOptionsItemSelected()方法,如果你将其返回结果为true(意味着你已经处理了该事件,不要将该事件继续传递下去),则action view将无法展开。
添加Action Provider
与action view相似,action provider使用定制的布局来取代了固定的action button. 它将一系列action放入子菜单,单击它会展示出来。
因为action provider定义了自身的action行为,所以无需在onOptionsItemSelected()方法中监听点击事件。
通过指定item的actionViewClass属性来指定使用的provider类,也可以通过继承并扩展ActionProvider类来自定义provider. Android预定义了一些provider,例如ShareActionProvider,便于开发者实现分享功能:
此时,我们需要指定分享要用到的Intent。这里,我们需要获取到MenuItem并传递给getActionProvider()方法,从而获取到provider。通过setShareIntent()方法设置分享所用到的Intent, 用来初始化分享action,但用户所处的context是变化的,所以必须及时更新要分享的intent。例子如下:
这时的shareActionProvider负责处理用户的一切交互行为,所以无需在onOptionsItemSelected()方法中处理监听事件。默认情况下,shareActionProvider记录了用户选择每个item的频率排名,并按此排名由高到低对所有item排序。
自定义provider
我们可以通过继承扩展ActionProvider 类来自定义provider,需要覆写如下几个方法:
- ActionProvider():构造方法中传入了app的context,应存为全局变量使用。
- onCreateActionView(MenuItem):在这个方法中定义item中要显示的view,完成初始化view和事件监听处理等操作:
- onPerformDefaultAction():当菜单选项从overflow中被选中,系统将会调用此方法。provider应该为菜单项提供一个默认的action。
然而,如果provider通过onPrepareSubMenu()方法提供了子菜单,那么即使这个provider被放入了overflow中,子菜单也会被展示出来。
添加导航Tabs
在action bar上添加导航的tabs可以帮助用户方便地切换视图,另外,这些导航tabs能很好地适配各种机型的屏幕。
首先,我们的界面上要有一个放置fragment的viewgroup,最基本的做法如下:
- 实现ActionBar.TabListener接口用于响应tabs的事件。
- 实例化需要添加的tab,并为它设置响应事件。
- 通过addTab()方法将实例化好的tab添加进去。
在这个例子中,当tab被点击时,listener将对应的fragment实例化并加入到布局中。接下来要创建tab对象并添加进action bar中。另外,需要设置setNavigationMode(NAVIGATION_MODE_TABS),使得tabs可见。下面展示如何使用listener:
当activity停止的时候,可以记录下当前tab所处的位置( getSelectedNavigationIndex()),这样再次打开activity时,就可以看到关闭时候的tab了。
我们也可以使用viewpager来管理fragment,我们只需在方法onTabSelected()中告诉viewpager当前选中了哪个fragment,这样就可以实现手势滑动切换view的功能了。
添加下拉导航
下拉导航通常用于放置那些必须但不是经常用到的导航项目。添加下拉导航通常需要以下步骤:
- 创建一个SpinnerAdapter用于提供可选择列表项。
- 实现ActionBar.OnNavigationListener接口,监听选择事件。
- 在activity的onCreate()中设置setNavigationMode(NAVIGATION_MODE_LIST)来使下拉列表可用。
- 通过setListNavigationCallbacks()方法设置下拉列表的回调函数:
actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback);
SpinnerAdapter是一个接口用于为spinner提供数据。同时,Android也提供了其他可以被继承的adapter,例如arrayadapter或simplecursoradapter。例如,通过arrayadapter创建一个使用字符串数组为数据源的adapter:
SpinnerAdapter mSpinnerAdapter =ArrayAdapter.createFromResource(this,
R.array.action_list, android.R.layout.simple_spinner_dropdown_item);
ActionBar.OnNavigationListener 接口中需要实现选中项目的响应事件,下面例子将一个fragment加入到布局中:
Android之Action Bar的更多相关文章
- 【Android】Android之Action Bar
Action Bar是在窗口上指示用户位置的组件,同时给用户提供导航和操作.使用Action Bar可以让你的应用在不同配置的屏幕上看起来比较一致.在开始之前,先了解一些相关的术语: Action B ...
- Android Action Bar简介
Android Action Bar简介 Design: Action Bar Action Bar是在屏幕顶端的一部分内容,通常在整个app进行中都保持存在. 它提供了几个关键的功能: 1.使得重要 ...
- Android 自定义title 之Action Bar
Android 自定义title 之Action Bar 2014-06-29 飞鹰飞龙... 摘自 博客园 阅 10519 转 25 转藏到我的图书馆 微信分享: Action Ba ...
- [转]【android studio】解决layout预览出现Rendering Problems Exception Unable to find the layout for Action Bar.
在android studio中打开layout文件,发现不能预览布局,提示以下错误: Rendering Problems Exception raised during rendering: Un ...
- Android开发之Action Bar
Action Bar代替了传统的位于设备屏幕的标题栏,主要用来显示应用程序的图标和活动的名称以及添加定制动作项等功能. 1. 显示和隐藏Action Bar 显示和隐藏Action Bar 一般有两种 ...
- Android Action Bar 详解篇 .
作者原创,转载请标明出处:http://blog.csdn.net/yuxlong2010 作为Android 3.0之后引入的新的对象,ActionBar可以说是一个方便快捷的导航神器.它可以作为活 ...
- Android学习路径(十)如何将Action Bar堆放在布局
默认情况下,action bar出如今activity窗体的顶部,稍微降低了activity布局的总空间.假设你想隐藏或者显示action bar,在这堂用户体验的课程中,你能够通过调用hide() ...
- Android学习路径(十)怎么会Action Bar堆放在布局
默认情况下.action bar出如今activity窗体的顶部.稍微降低了activity布局的总空间. 假设你想隐藏或者显示action bar.在这堂用户体验的课程中,你能够通过调用hide() ...
- Android学习路径(七)建立Action Bar
在action bar最今本的形式中,它只在左边展示了activity的标题以及应用的icon. 即使在这样的简单的形式中,它也不过告诉用户如今在应用的哪个activity中,同一时候为你的应用保持一 ...
随机推荐
- [读书笔记]-技术学习-Redis
1:Redis概览 Remote Dictionary Server 远程字典服务 Redis是基于内存的存储 在一台普通的笔记本上,Redis每秒的读取速度可以达到10万 内存读取数据,断电的时候数 ...
- luoguP3979 遥远的国度 LCT+multiset维护子树信息
Code: #include<bits/stdc++.h> #define maxn 150000 #define ll long long #define inf 21474836470 ...
- BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理 状压DP + 二进制 + 骚操作
#include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #defin ...
- 【剑指Offer】6、旋转数组的最小数字
题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5 ...
- win10下一分钟快速搭建rtmp推流服务器
为了让大家少踩笔者踩过的坑,目前将工作中搭建rtmp推流服务器的步骤总结如下: 步骤1: 下载 nginx 1.7.11.3 Gryphon 下载链接: http://nginx-win.ecsds. ...
- 软件工程1916|W(福州大学)_助教博客】团队Beta冲刺作业(第9次)成绩公示
1. 作业链接: 项目Beta冲刺(团队) 2. 评分准则: 本次作业包括现场Beta答辩评分(映射总分为100分)+团队互评分数(总分40分)+博客分(总分130分)+贡献度得分,其中博客分由以下部 ...
- greenplum数据迁移
源集群: 登录集群su - gpadminpsql -d postgres查询数据库信息\l查询用户信息\du 备份需要迁移的库到指定目录pg_dump -C testdata > /home/ ...
- (21)Spring Boot过滤器、监听器【从零开始学Spring Boot】
Spring Boot 系列博客] )前言[从零开始学Spring Boot] : http://412887952-qq-com.iteye.com/blog/2291496 )spring boo ...
- 检測wifi是否须要portal验证 公共场所wifi验证
何为wifi portal验证? 平时在商场,咖啡厅,银行等公共场所.我们手机提示:有可用WLAN.这些WIFI能够直接连接,不须要password,但须要我们手动在手机网页上进行验证,通常是输入一个 ...
- 关于PHP浮点数之 intval((0.1+0.7)*10) 为什么是7
PHP是一种弱类型语言, 这样的特性, 必然要求有无缝透明的隐式类型转换, PHP内部使用zval来保存任意类型的数值, zval的结构如下(5.2为例): struct _zval_struct { ...