Action Bar在实际应用中,很好地为用户提供了导航,窗口位置标识,操做点击等功能。它出现于Android3.0(API 11)以后的版本中,在2.1以后的版本中也可使用。android
添加与隐藏Action Bar 数组
在3.0以后的版本中(android:minSdkVersion 或者 android:targetSdkVersion 属性被设置成11或者更高),默认在activity中添加了Action Bar,不用额外添加。若是不想在activity中使用Action Bar,咱们能够经过设定activity的主题来实现。app
在程序运行过程当中,也能够动态隐藏或者显示Action Bar:ide
动态显示或隐藏将引发当前的activity界面重绘。若是须要频繁的显示或隐藏,可使用overlay模式,将一个action bar固定在当前activity界面上方,不管显示或隐藏都不会使activity界面重绘。函数
为Action Bar添加Item 布局
action bar上一般放置着最经常使用的item便于用户进行操做,那些不重要的item会被隐藏于overflow 的item中。Item一般被预约义于menu资源文件中,以下:ui
当一个activity启动后,在onCreateOptionsMenu()方法来填充ab中预设的item。this
在item的showAsAction属性中,选项含义以下:spa
处理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,须要覆写以下几个方法:
然而,若是provider经过onPrepareSubMenu()方法提供了子菜单,那么即便这个provider被放入了overflow中,子菜单也会被展现出来。
添加导航Tabs
在action bar上添加导航的tabs能够帮助用户方便地切换视图,另外,这些导航tabs能很好地适配各类机型的屏幕。
首先,咱们的界面上要有一个放置fragment的viewgroup,最基本的作法以下:
在这个例子中,当tab被点击时,listener将对应的fragment实例化并加入到布局中。接下来要建立tab对象并添加进action bar中。另外,须要设置setNavigationMode(NAVIGATION_MODE_TABS),使得tabs可见。下面展现如何使用listener:
当activity中止的时候,能够记录下当前tab所处的位置( getSelectedNavigationIndex()),这样再次打开activity时,就能够看到关闭时候的tab了。
咱们也可使用viewpager来管理fragment,咱们只需在方法onTabSelected()中告诉viewpager当前选中了哪一个fragment,这样就能够实现手势滑动切换view的功能了。
添加下拉导航
下拉导航一般用于放置那些必须但不是常常用到的导航项目。添加下拉导航一般须要如下步骤:
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加入到布局中: