- ActionBar:位于标题栏的位置,要关闭ActionBar 可以配置android:theme=”@android:style/Theme.Holo.NoActionBar”,也可以调用Actionbar的Hide()函数.ActionBar提供了如下功能:
- 显示选项菜单的菜单项(将菜单项显示成Action Item)
- 使用程序图标作为返回Home主屏或向上的导航操作
- 提供交互式View作为Action View
- 提供基于Tab的导航方式,可以用于切换多个Fragement
- 提供基于下拉的导航方式
- ActionBar无法同时显示所有的菜单项时,Android会根据不同手机设备采取不同行为:
- 对有menu键的手机,点menu键即可显示剩余菜单项,菜单项无法显示图标
- 对于没有menu键的手机,android会在最后显示一个折叠图标,用户点击折叠图标就会显示剩余菜单
- MenuItem title中的内容通常情况下只会在overflow中显示出来,ActionBar中由于屏幕空间有限,默认是不会显示title内容的。但是出于以下几种因素考虑,即使title中的内容无法显示出来,我们也应该给每个item中都指定一个title属性:
- 当ActionBar中的剩余空间不足的时候,如果Action按钮指定的showAsAction属性是ifRoom的话,该Action按钮就会出现在overflow当中,此时就只有title能够显示了(通过反射调用特殊方法,也可以使图标显示在overflow menu中)。
- 如果Action按钮在ActionBar中显示,用户可能通过长按该Action按钮的方式来查看到title的内容。
- 屏幕阅读器(盲人使用)可以独处Menu的tit
- 如果是在Fragment中添加的menu item,那么单击item时会先调用Activity的onOptionsItemSelected然后是Fragment的onOperationsItemSelected
- ActionBar除了显示Action Item以外,还可以显示普通的UI组件,称为action view,这样的item要指定android:showAsAction="ifRoom|collapseActionView"属性收缩成一个图标item,以减少占用的空间,当点击item时控件会自己展开,如果要为UI组件添加事件处理等,可以用如下方式: 可以用如下两种方式:
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.options, menu); SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); // Configure the search info and add any event listeners ... return super.onCreateOptionsMenu(menu); }
- 添加Action Item时,设置android:actionViewClass指定Action View的实现类
- 添加Action Item时,使用android:actionLayout指定Action View对应的视图资源
- 选项菜单中能够加到Actionbar中直接显示的item一般要满足下列条件之一,而Help,Setting,FeedBack等要放到overflow menu中
- 经常使用
- 重要
- 典型
- Android 4.0开始支持split actionbar,split actionbar会在屏幕底部显示一部分menu item,以确保顶部actionbar有足够空间显示icon和title等,对于Tab导航的actionbar,隐藏actionbar的title和icon,使用split actionbar可以使tab导航显示在屏幕最顶部。在<activity>或<application>元素中设置
uiOptions="splitActionBarWhenNarrow"支持split actionbar,
使用在低于4.0的android也可以使用android:uiOptions属性,系统不识别该属性就会使用之前版本的actionbar布局 - ActionBar调用setHomeButtonEnabled使图标变为可点击的按钮(也可以理解为menu item),menu id为android.R.menu.home(系统id),可以在onOptionsItemSelected中处理该单击事件,行为应该是下面行为之一:
- 返回application的主activity(navigating back)
Intent intent = new Intent(this, HomeActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
- 返回application的上一层(navigating up)
- 返回application的主activity(navigating back)
- setHomeButtonEnabled使应用程序图标可以点击,setDisplayHomeAsUpEnabled函数(Android 4.0后才有)在应用程序图标上加上向左的箭头并使图标可点击,对应ActionBar.DISPLAY_HOME_AS_UP, 行为是navigating up,要注意的是navigating up的行为同navigating back(返回按钮的行为)行为一样都要自己在onOptionsItemSelected中实现,与navigating back行为的区别是:
- Action Provider:如同action view一样,action provider也可以替代action item,它可以自定义item的appearance和behaviors,还可以为item创建submenu.自定义ActionProvider要实现的函数:
- ActionProvider():构造函数,会传Context参数,用于其他函数
- onCreateActionView():为action item定义action view,可以使用Context获取一个LayoutInflater,然后填充action view
public View onCreateActionView() { // Inflate the action view to be shown on the action bar. LayoutInflater layoutInflater = LayoutInflater.from(mContext); View view = layoutInflater.inflate(R.layout.action_provider, null); ImageButton button = (ImageButton) view.findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Do something... } }); return view; }
- onPerformDefaultAction():menu item在overflow menu中时,点击item执行的action,如果通过onPrepareSubMenu()函数创建了submenu,则点击overflow menu中的item时不会执行onPerformDefaultAction,而是会弹出submenu。如果Activity或Fragment实现了onOptionsItemSelected()函数并返回True,onPerformDefaultAction()也不会被调用
- onPrepareSubMenu():创建与指定了ActionProvider的menu item关联的submenu.只有当hasSubMenu函数返回True时该方法才执行
- ShareActionProvider:为actionbar提供一个share action,比如为短信引用或者社交应用分享照片,需要配置actionProviderClass属性,
ShareActionProvider实现了创建子菜单,弹出显示分享目标应用,处理单击事件等逻辑,根据用户选中的频率,ShareActionProvider为每个分项目标都保存了一个优先级,优先级高的保存在列表靠前的位置,使用最多的应用作为默认分享目标直接显示在actionbar上,优先级信息默认是存放在一个私有文件中,文件名为DEFAULT_SHARE_HISTORY_FILE_NAME指定.使用ShareActionProvider的步骤通常为:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_share" android:title="@string/share" android:showAsAction="ifRoom" android:actionProviderClass="android.widget.ShareActionProvider" /> ... </menu>
- 获取ShareActionProvider对象
mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
- 调用ShareActionProvider.setShareIntent(Intent)方法,Intent参数的action必须是ACTION_SEND,并带有附加数据,如果EXTRA_TEXT,EXTRA_STREAM等
ShareActionProvider
- 获取ShareActionProvider对象
- ActionBar Tab导航的实现步骤如下:
- ActionBar还提供了下拉式导航方式,需要调用setNavigationg(ActionBar.NAVIGATON_MODE_LIST)方法设置使用下拉列表导航方式,调用setListNavigationCallbacks添加列表,并为每个列表设置事件监听器