Action Bar
在Android 3.0 (API level11)增加的特性。是一种窗口特性,标识了应用程序,提供user actions与导航modes,显示每个画面的上方,默认的系统theme :
Holo,都会有Action Bar存在
。在menu中,提到了contextual action mode,使用ActionMode,它会临时占据action bar的位置,但与
ActionBar是独立的。
ActionBar的主要目的:
1、<wbr></wbr>使一些重要的actions能够显著的显示与访问
2、<wbr></wbr>在apps内,提供了一致性的导航与view间的切换
3、<wbr></wbr>很少使用的actions,提供了action overflow,画面不会凌乱
4、<wbr></wbr>为标识app提供了位置空间
ActionBar设计模式:http://developer.android.com/design/patterns/actionbar.html
ActionBar分为四个功能区域:
1、App icon,app的标识,如果画面不是top-level画面,可以在icon左边显示Up caret,用户能够在hierarchy中向上导航
2、View control,如果app在不同的view显示数据,这个部分可以用来切换view,使用drop-down menu;如果不支持不同的view,可以来显示app title
3、Action buttons,显示重要的actions
4、Action overflow,使用不太频繁的actions
使用split actionbars适配不同的屏幕大小,action bar的位置可被放置在三个位置
<wbr><wbr><wbr></wbr></wbr></wbr>Main action bar<wbr><wbr><wbr></wbr></wbr></wbr>Top bar<wbr><wbr><wbr></wbr></wbr></wbr>Bottom bar
Adding the ActionBar
从Android 3.0 (API level 11),如果使用默认的Theme.Holo
theme,activity自动包含action bar。可以通过<uses-sdk android:minSdkVersion="11"/>或android:targetSdkVersion="11" 来达到目的。
Removing the actionbar
<activity android:theme="@android:style/Theme.Holo.NoActionBar">
或设置android:windowActionBar
为false。其实
NoActionBar也是同样的,在android fw的themes.xml中
<wbr><wbr><wbr></wbr></wbr></wbr><style name="Theme.Holo.NoActionBar">
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><item name="android:windowActionBar">false</item>
<wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr><item name="android:windowNoTitle">true</item>
</style>
Adding ActionItems
通过options menu。可以在menu的xml资源中,对menu item增加android:showAsAction属性
Using split actionbar
split actionbar是在宽屏上,可以把action item现在是上方,窄屏显示在下方(上方留着显示navigation与title),简单添加android:uiOptions
="splitActionBarWhenNarrow<wbr>"</wbr>
到<activity> or<application>即可
Using the App Icon forNavigation
当点击icon时,系统回调activity的onOptionsItemSelected()
依android.R.id.home
,可以这样: <wbr><wbr><wbr><wbr><wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr>Intent intent = new Intent(this, HomeActivity.class); <wbr><wbr><wbr><wbr><wbr><wbr> intent</wbr></wbr></wbr></wbr></wbr></wbr>.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); <wbr><wbr><wbr><wbr><wbr><wbr> startActivity</wbr></wbr></wbr></wbr></wbr></wbr>(intent); 回到"home" activity
Navigating up
依赖application's view hierarchy向上导航("up" indicator),可以在activity的onCreate回调中 <wbr><wbr></wbr></wbr>ActionBar actionBar = getActionBar(); <wbr><wbr> actionBar</wbr></wbr>.setDisplayHomeAsUpEnable<wbr>d</wbr>(true);
Adding an ActionView
当选中一个action item时,可以显示一个action view.可以在menu item(action item)中指定android:actionLayout
或android:actionViewClass属性,前者是layout 资源,后者是class;另外
android:showAsAction="ifRoom|collapseActionView",增加collapseActionView,否则action view默认就是显示的,而不是选中action item;
可以在onCreateOptionsMenu中menu.findItem(R.id.XXXX).getActionView();来获得这个action view,从而有机会增加event hooks.menu item也可以menuItem.setOnActionExpandListene<wbr>r</wbr>来侦听action view显示与收起。Menuitem(在onCreateOptionsMenu回调,通过menu.findItem(R.id.actionItem)获得)的expandActionView()
andcollapseActionView()
显性控制action view的显示与收起.
Adding an ActionProvider
Action provider(defined by theActionProvider
class)很像action view,替换action item依一个定制的layout,但是它控制着item的后续的行为,比如action item的外观与行为,以及如果放到overflow的行为; 如:ShareActionProvider继承与AcionProvider,
可以指定一个intent,把能处理这个intent项依list来显示出来。
使用ShareActionProvider: menu item增加android:actionProviderClass="android.widget.ShareActionProvider";定义intent;如:
在onCreateOptionsMenu中 mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider(); mShareActionProvider.setShareIntent(intent);
如果你使用ShareActionProvider在一个app中多次,需要分开显示的列表,通过setShareHistoryFileName
如果自己定义Action Provider,扩展ActionProvider
;实现构造函数,onCreateActionView()返回action view;
onPerformDefaultAction()系统调用它,当menu item在
overflow menu中被选中。如果定制的action provider想显示menu,可以onPrepareSubMenu()
Adding NavigationTabs
当在一个activity想用navigation tabs,使用action bar's tabs来代替TabWidget(tabs
页面,不直接用,使用TabHost,TabWidget是TabHost的孩子),因为
action bar tabs自动适配屏幕大小,当宽屏幕,直接放置main action bar上;当窄屏幕时,独立一个bar(stacked action bar)。
使用tab来切换fragment, 需要做下面这些事:
1、
在activityonCreate()
callback中,首先把actionbar get出来,getActionBar();设置setNavigationMode(NAVIGATION_MODE_TABS)
,如果tab title指示显示的内容,应该把activity title隐藏setDisplayShowTitleEnabl<wbr>ed(false)</wbr>
2、
增加ActionBar.Tab到actionbar中,每个tab有自己的listener,来监听自己是否被选中与取消选中;在被选中的callback :
onTabSelected(Tab tab, FragmentTransaction ft),
把fragment attach到参数ft中; 取消选中时detach;并设置每个tab的text
Adding Drop-downNavigation
action bar也提供了内建的drop-downlist,可以使用它来切换显示内容,比如排序。
步骤:
ActionBar actionBar = getActionBar(); actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setListNavigationCallbac<wbr>ks</wbr>(mSpinnerAdapter, mNavigationCallback);
实现SpinnerAdapter
(为spinner widge提供数据源)与ActionBar.OnNavigationListener(仅仅一个callback来标识选中的item)是主要的工作
Styling the ActionBar
android:windowActionBarOverlay:actionbar
是否会影响activity的layout,如果设置为true后,activity的layout会占据所有屏幕,action bar压住activity layout
另外可以定制Action items的背景,分割图,text颜色;Navigation tabs与Drop-down lists的样式。也可以定制整个action bar的背景