ActionBar,曾经的导航栏
ActionBar 是Android3.0之后引入的为统一UI风格的导航栏,到了5.0之后,因为MD概念的出现,Google推荐使用ToolBar来代替ActionBar,从而延续统一的UI设计风格,让大部分App在Android系统上无论是观感上还是操作上,都保持一致性。
ActionBar长啥样?
上图,就是Google官网给出的ActionBar的照片,其中【1】可以是应用的图标,也可以是当前界面想要展示的icon;【2】统一称为,action按钮;【3】则是overflow按钮,当设置action按钮在ActionBar上已没有空间时,都会在overflow按钮中,以类似折叠形式存在。「PS:目前,在5.0以上系统,ActionBar基本上都是在系统层应用上有所体现,如文件管理器等」
ActionBar怎么用?
在Android Studio中创建的项目,系统默认的就是ActionBar(v7包的ActionBar),不过从Theme PreView来看,google已经就任一界面的样式上已达成一致,值得一提的是ToolBar如果要使用,应该要在xml文件中声明出来并设置Theme为xxx.NoActionBar,如下截图预览:
我们注意到style.xml中Theme中三个颜色属性分别用来设置什么的,
1. colorPrimary属性控制App bar背景颜色,这个无论是Tool bar 还是v7包下的Action bar 都是用该属性控制,和版本无关
2. colorPrimaryDark属性控制Status Bar的颜色,比较常见的场合是把colorPrimaryDark和colorPrimary设置成一样的颜色,做成“沉浸式”状态栏(在5.0以前,Status Bar不受该属性控制)
3. colorAccent控制的是相关控件显示的颜色,如ProgressBar的颜色在5.0前后是不一样的,有了colorAccent,在5.0之后的版本,控件的颜色基本统一起来
Action Bar相关API
Action bar的icon或logo
logo不是必需的,icon默认以application或activity的icon,当2者同时指定,需要另外指定到底显示logo还是icon,这是通过方法setDisplayOptions()
来确定的。setDisplayHomeAsUpEnabled()
控制显示Action bar最左边的导航按钮(不一定是返回按钮的功能),默认显示为左箭头。
setDisplayShowHomeEnabled()
控制显示icon/logoAction bar的title或subtitle
setDisplayShowTitleEnabled()
控制显示标题Action bar的action按钮
action按钮可能是Action bar上最重要的组成部分了,通过action按钮,用户可以进行诸如,文件多选,批量删除,分享,移动,搜索,排序等一连贯操作。因为,我们的Action Bar在Activity中显示的(一般在最上方,状态栏下方),所以添加action按钮,必然是在activity中实现,这就是菜单,详见Android Menu。Action bar的overflow按钮
当res/menu/xxx.xml中定义的action按钮过多时,系统会自动把剩下的放到一个浮动的上下文菜单中,这也意味着,必需把最重要的action按钮定义在xml的前面,保证直接可以在Action bar上直接找到。
Android Menu
在src下,创建menu菜单资源目录,新建[filename].xml,注意根节点使用menu,示例如下:
其中,可见属性title控制了action显示的文字,注意id属性不是必需的,但是一般来说,action必然是为了交互而展示出来,因此id属性可以让我们为每个action设置相应的触发事件,从而完成不同的交互体验,同时,默认情况下action都在overflow按钮内部。
action的属性
showAsAction
指定了该按钮显示的位置,主要有以下几种值可选:always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示,ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中,never则表示永远显示在overflow中。icon
指定action按钮的图标,注意当action直接显示在Action bar中而非在overflow中时,会覆盖文字显示。
设置好菜单的资源文件后,在activity中通过以上代码加载菜单文件
设置action的触发事件
无论是直接显示在Action bar上还是隐藏在overflow中,action的点击事件,才是真正完成用户操作的交互体验;显然,activity中必然要处理action点击事件,代码如下:
onOptionsItemSelected()
方法的返回值决定了消费掉本次事件,当确认有action时,必须返回true
Action View
action view是一种比action按钮交互体验更好的控件,能做到更复杂的交互逻辑,如:全局搜索。actionViewClass
属性来指定系统中已有的相关控件,如搜索控件,而无须自行设计搜索逻辑。
When using the appcompat library, menu resources should refer to the showAsAction in the app: namespace, not the android: namespace. Similarly, when not using the appcompat library, you should be using the **android:**showAsAction attribute.
PS:当我们的activity继承自AppCompatActivity,则有些属性应该使用app:xxx,同时,获取action bar时应该使用get**Support**XXX();当然,如果不使用兼容包,即继承Activity,无须考虑这么多。
添加Action Provider
和Action View有点类似,Action Provider也可以将一个Action按钮替换成一个自定义的布局。但不同的是,Action Provider能够完全控制事件的所有行为,并且还可以在点击的时候显示子菜单。
类似,action view需要添加属性actionProviderClass
来指定一个类,这个类既可以是系统自带的,也可以是我们自定义的,不过必须给出全路径名。
兼容低版本的Action Provider
在onCreateOptionsMenu()
中自然就能获取到,代码如下:
上述是在AppCompatActivity兼容下的代码,若不考虑兼容低版本,直接通过方法item2.getActionProvider()
即可。
自定义Action Provider
新建一个MyActionProvider继承自ActionProvider,为了表示这个Action Provider是有子菜单的,需要重写hasSubMenu()方法并返回true,然后在onPrepareSubMenu通过调用SubMenu的add()方法添加子菜单。
Tabs
Tabs的应用可以算是非常广泛了,它可以使得用户非常轻松地在你的应用程序中快速切换不同的视图,在很多新闻类客户使用广泛(实现方式不限于此)。
- 实现ActionBar.TabListener接口
- 创建Tab示例
- 设置监听并添加到ActionBar中
【注意】:该接口谷歌已在API中标记为废弃,谨慎使用
创建Tab示例并添加到ActionBar中展示,可见这种Tab方式已不推荐使用。
通过自定义样式主题,很容易实现自定义的Tab标签效果,具体过程,略。