- 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)
- 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属性,
<?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实现了创建子菜单,弹出显示分享目标应用,处理单击事件等逻辑,根据用户选中的频率,ShareActionProvider为每个分项目标都保存了一个优先级,优先级高的保存在列表靠前的位置,使用最多的应用作为默认分享目标直接显示在actionbar上,优先级信息默认是存放在一个私有文件中,文件名为DEFAULT_SHARE_HISTORY_FILE_NAME指定.使用ShareActionProvider的步骤通常为:
- 获取ShareActionProvider对象
mShareActionProvider = (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();
- 调用ShareActionProvider.setShareIntent(Intent)方法,Intent参数的action必须是ACTION_SEND,并带有附加数据,如果EXTRA_TEXT,EXTRA_STREAM等
ShareActionProvider @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
// Get the ActionProvider for later usage
provider = (ShareActionProvider) menu.findItem(R.id.menu_share)
.getActionProvider();
//必须要在菜单点击前调用doShare,不然菜单没办法点击
doShare();
return true;
}
public void doShare() {
// populate the share intent with data
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, "This is a message for you");
provider.setShareIntent(intent);
}
- ActionBar Tab导航的实现步骤如下:
- 调用ActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TAB)设置使用tab导航
- 调用ActionBar.addTab方法添加多个tab标签,并为每个tab标签添加事件监听器.系统会根据屏幕大小自动调整tabs,大屏在action bar上显示,小屏在单独的bar上显示,称为stacted action bar
- ActionBar还提供了下拉式导航方式,需要调用setNavigationg(ActionBar.NAVIGATON_MODE_LIST)方法设置使用下拉列表导航方式,调用setListNavigationCallbacks添加列表,并为每个列表设置事件监听器
|