关于ActionBar
引用:http://threezj.com/2015/09/29/ActionBar%E8%AF%A6%E8%A7%A3/
ActionBar是个窗体功能来鉴别用户当前在app中的位置,提供给用户一些功能和导航。通过ActionBar可以方便的让系统自动的适配不同尺寸的屏幕。
ActionBar是个窗体功能来鉴别用户当前在app中的位置,提供给用户一些功能和导航。通过ActionBar可以方便的让系统自动的适配不同尺寸的屏幕。
ActionBar包含如下内容。
- App icon
- Action item(项目)
- Action overflow(放不下的item,放在overflow里)
添加依赖
- 如果API等级比11低
import android.support.v7.app.ActionBar
* 如果API等级比11高或者相等import android.app.ActionBar
- 如果API等级比11低
加入一个ActionBar
在你的布局里引入一个ActionBar,只需要2步
- 创建一个活动继承自
ActionBarActivity
(但是现在被AppCompatActivity
替代,所以继承AppCompatActivity
即可) - 在你的activity声明中加入
<activity android:theme="@style/Theme.AppCompat.Light">
删除ActionBar
你可以在程序运行时隐藏ActionBar,像这样。
|
|
android系统会自动调整布局来填充,隐藏的ActionBar。如果你希望它显示回来,可以使用
show()
方法。调整图标和标题
可以通过改变activity中的 logo和lable属性来替换图标和标题。
添加Action Items
一般ActionBar有三个Action按钮和一个overflow按钮。首先你要res/menu/目录下创建一个布局,来设置Action。
比如像这样,创建res/menu/main_activity_actions.xml
|
|
然后当Activity启动,系统填充ActionItem时,会调用
onCreateOptionsMenu()
方法。通过这个方法来加载一个菜单资源(menu resource),按照你刚才设置的布局来加载Item。
|
|
布局文件中的
showAsAction
属性可以确定item是在overflow里还是在外面。
|
|
注意 showAsAction这个属性 必须要自定义一个名字空间来使用
xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
yourapp:showAsAction="ifRoom" />
- ifRoom 会显示在ActionBar 如果屏幕空间不足,则藏到Overflow里
- never 永远只在Overflow里显示,而且只显示标题
- always 总是显示
- withText 尽可能的显示标题。空间不足则不显示
- collapseActionView 声明这个View被折叠到按钮。选择了按钮才会打开。配合ifRoom使用
监听Action Button的点击事件
一旦用户按下ActionButton,则会回调
onOptionsItemSelected()
方法。
|
|
使用Split Action Bar
当你的activity运行到一个狭窄的屏幕上时,这是系统会自动适配你的ActionItem.通过Split Action Bar显示在屏幕底部。如下图。
只要两步你就能启用Split Action Bar
- 如果你的环境是API14及以上,只要加
uiOptions="splitActionBarWhenNarrow"
属性到每一个activity
元素中,或者<application>
2. 为了支持老的版本,你还需要加一个<meta-data>
元素到activity
中,如下定义。123456<manifest><activity uiOptions="splitActionBarWhenNarrow" ... ><meta-data android:name="android.support.UI_OPTIONS"android:value="splitActionBarWhenNarrow" /></activity></manifest>
使用向上导航菜单(Navigating Up)
如果窗体A中有系列的item,选择了一个item以后,跳转到窗体B,此时可通过Navigating Up来返回到窗体A.
注意Navigating Up和back键不同。back键的返回顺序是按窗体创建的时间顺序倒序返回。而不是app之间的层次结构。比如说即使你跳转到了窗体C,按了Navigating Up之后还是会跳转到窗体A。
注意Navigating Up和back键不同。back键的返回顺序是按窗体创建的时间顺序倒序返回。而不是app之间的层次结构。比如说即使你跳转到了窗体C,按了Navigating Up之后还是会跳转到窗体A。
你可以像这样启用up button
|
|
然而此时并没有什么用,还需要在activity中注册父活动。也就是说返回的时候会返回到父活动。
API16以上只要直接设置
API16以上只要直接设置
parentActivityName
属性即可
|
|
这两步完成 upbutton就会正常工作了。
如果你允许其他App来启动这个activity则要覆写
onOptionsItemSelected()
这个方法
|
|
添加Action View
Action View对复杂的动作可提供快速的访问,而不需要改变activity或者fragment,而且不用改变ActionBar。
要定义一个Action View,必须在
actionLayout
或者actionViewClass
属性中指定布局资源或者widge类。比如,添加SearchView
|
|
注意
如果你希望配置添加的ActionView,像这样获取
howAsAction
包含了一个"collapseActionView"
值,这个选项表示Action View可折叠。如果你希望配置添加的ActionView,像这样获取
|
|
API11及以上,可这样获取
menu.findItem(R.id.action_search).getActionView()
处理可折叠的Action View
Action View展开后,按back键或者upbutton可折叠。覆写
OnActionExpandListener
中的onMenuItemActionCollapse
和onMenuItemActionExpand
可分别监听展开和折叠。
|
|
Action Provider
和ActionView差不多,Action Provider同样可以把一个action按钮替换成自定义的布局。然而不同的是,Action Provider能完全控制动作的行为和展示一个子菜单。
要定义一个Action Provider,需在
你可以建立自定义的Action Provider通过继承
要定义一个Action Provider,需在
menu
的item
标签中指定actionViewClass
属性为ActionProvider
你可以建立自定义的Action Provider通过继承
ActionProvider
类,一般来说,android会提供一些预建的Action Provider,比如ShareActionProvider
,如下图。
因为每一个ActionProvider有自己明确的动作,所以不必监听
onOptionsItemSelected()
,如果你非要监听也是可以的,但注意要return false
,以便ActionProvider,回调onPerformDefaultAction
方法来执行动作。
然而,如果你的ActionProvider会启用子菜单,则不必监听
onOptionsItemSelected()
。使用ShareActionProvider
第一步,上文中已经说了,在
menu
的item
标签中指定actionViewClass
属性为ActionProvider
。
|
|
第二步 定义你希望用来分享的
Intent
|
|
第三步 覆写
onCreateOptionsMenu
方法,注意,当Intent发生改变时一定要重新执行一次setShareIntent()
.
|
|
ShareActionProvider会按照使用的频繁程度来排序菜单。
创建自定义Acion Provider
你也可以自定义Acion Provider通过继承自ActionProvider类且实现一些适当的回调方法。如下是一些比较重要的方法。
ActionProvider(Context context)
构造函数不多说。public View onCreateActionView (MenuItem forItem)
通过这个方法来定义ActionView,像这样。
|
|
public boolean onPerformDefaultAction ()
当Action overflow中的菜单项被选中时会调用,或者action provider希望执行默认动作通过菜单项。
添加Navigation Tabs
用户可以方便地使用Navigation Tabs来浏览不同的View。更重要的是,Tabs能完美适配不同尺寸的屏幕,像这样。
实现Navigation Tabs需要两步。
- 实现
ActionBar.TabListener
接口,这个接口为Tabs事件提供一些回调方法,比如说滑动标签的时候。 - 如果你要添加一个标签,必须实例化标签,并且调用
setTabListener()
,和tab的标题setText()
3.把Tab加到ActionBar中,通过addTab()
下面是一个关于实现
ActionBar.TabListener
接口的Demo
|
|
需要弄明白的是
android.R.id.content
的是意思。‘android.R.id.content’ gives you the root element of a view,without having to
know its actual name/type/ID. Check out Get root view from current activity
可以说
android.R.id.content
是一个Viewgroup
包含View
的容器,可表示所有View
下面是添加Tabs的Demo
|
|
添加 Drop-down Navigation
ActionBar提供的另外一种导航模式Drop-down Navigation,也被称作Spinner。
使用Drop-down Navigation的步骤和Tabs大同小异
- 创建
SpinnerAdapter
12SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this,R.array.action_list, android.R.layout.simple_spinner_dropdown_item); - 实现
ActionBar.OnNavigationListener
接口1234567891011121314151617181920mOnNavigationListener = new OnNavigationListener() {// Get the same strings provided for the drop-down's ArrayAdapterString[] strings = getResources().getStringArray(R.array.action_list);public boolean onNavigationItemSelected(int position, long itemId) {// Create new fragment from our own Fragment classListContentFragment newFragment = new ListContentFragment();FragmentTransaction ft = getSupportFragmentManager().beginTransaction();// Replace whatever is in the fragment container with this fragment// and give the fragment a tag name equal to the string at the position// selectedft.replace(R.id.fragment_container, newFragment, strings[position]);// Apply changesft.commit();return true;}}; - 调用
setNavigationMode(NAVIGATION_MODE_LIST)
方法。
4.调用
setListNavigationCallbacks()
方法actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback);
本文主要内容来自Android Doc,我自己进行了加工理解。
沒有留言:
張貼留言