添加Actionbar 一开始发现一个问题 到底是用ActionBarActivity还是普通的Activity。其实不用纠结什么,ActionBarActivity默认有个标题栏,创建activity的时候自动就有了,activity默认没有标题栏,但是你可以在代码中手动添加一个标题栏。
Actionbar位于传统标题栏的位置,也就是显示在屏幕的顶部。
Actionbar提供了如下功能:
1.显示选项菜单optionsMenu的菜单项(Action Item)。
2.使用程序图标作为返回Home主屏或向上的导航操作。
3.提供交互式View作为Action View。
4.提供基于Tab的导航方式,可用于切换多个Fragment。
5.提供基于下拉的导航方式。
接下来代码带注释进行说明。//获取Actionbar实例
ActionBar actionBar = getActionBar();
// 是否显示应用程序图标,默认为true
actionBar.setDisplayShowHomeEnabled(true);
// 是否显示应用程序标题,默认为true
actionBar.setDisplayShowTitleEnabled(true);
//是否将应用程序图标转变成可点击的按钮,默认为false。
actionBar.setHomeButtonEnabled(true);
//在应用程序图标的左边显示一个向左的箭头,
actionBar.setDisplayHomeAsUpEnabled(true);
//这里需要注意一点 如果设备有物理菜单按键,需要将其屏蔽才能显示OverflowMenu 代码如下 在对Actionbar进行基本配置后就可以设置了
try {
ViewConfiguration config = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class
.getDeclaredField("sHasPermanentMenuKey");
if (menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(config, false);
}
} catch (Exception e) {
e.printStackTrace();
}
//对Actionbar进行配置 需要实现三个方法
//加载Actionbar显示的菜单
onCreateOptionsMenu(Menu menu);
//对于点击的菜单某一项的事件捕获
onOptionsItemSelected(MenuItem item)
//解决menu里面设置了图标而不显示的问题 在menu打开时有一个处理
onMenuOpened(int featureId, Menu menu)
//在创建菜单时候 很简单加载你创建的menu的xml文件
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.actionbar_menu, menu);
return super.onCreateOptionsMenu(menu);
这里解释一些menu的item的一些属性
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.example.myrecyclerview.MainActivity" >
<item
android:id="@+id/main_delete"
android:icon="@drawable/save"
android:showAsAction="always"
android:title="@string/menu_delete"/>
</menu>
主要是这个showAsAction这个属性showAsAction属性用来定义每个Action是如何显示的,always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示,ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中,never则表示永远显示在overflow中。
这里会遇到一个问题 显示在Actionbar中的action设置了图标不显示的问题 如果你的Activity继承的是v7包的Actionbar则需要以下操作才能显示
menu属性中加入 xmlns:app=
"http://schemas.android.com/apk/res-auto"
并将android:showAsAction 换成 app:showAsAction.
给actionbar添加了action之后需要监听这个action点击事件就需要实现onOptionsItemSelected(MenuItem item)方法
使用很简单 可以通过item.getitemId拿到对应action的id则可以监听到点击事件 如下代码
@Overridepublic boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
/*
* 将actionBar的HomeButtonEnabled设为ture,
* 将会执行此case
*/
case android.R.id.home:
finish();
break;
case R.id.add:
Toast.makeText(this, "添加", Toast.LENGTH_LONG).show();
break;
// 其他省略...
default:
break;
}
return super.onOptionsItemSelected(item);
}
实现onMenuOpened(int featureId, Menu menu)解决menu里面的图标不显示的问题则只需要在该方法里面实现如下代码即可:
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {
if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
try {
Method m = menu.getClass().getDeclaredMethod(
"setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu, true);
} catch (Exception e) {
Log.d("OverflowIconVisible", e.getMessage());
}
}
}
return super.onMenuOpened(featureId, menu);
}