ActionBar是在Honeycomb(3.0版本 )的时候被引入,给我们提供了一个丰富的框架来给用户提供动作和导航。在本篇文章中我们将看看ActionBar的基础知识和简单的实现与快速的运行。
之前已经提过ActionBar是在Honeycomb(API Lever 11)的时候被引入的,然而借助Jake Wharton所写的优秀的向后兼容类库
ActionBarSherlock
让ActionBar一样可以支持2.x版本的设备。我将把注意力集中在原生的Android APIs,但是大部分(即便不是所有)我在本文所涉及的内容你用ActionBarSherlock一样可以很好的工作。
让一个基本的ActionBar工作真的是很容易。ActionBar取代了一直存在于Android的Options Menu(选项菜单)所提供的功能,所以它扩展了现有的Options Menu框架,仅仅是对标准的Options Menu定义添加额外的参数。一个例子就可以说明这一点远比干解释要强,所以让我们新建一个项目:项目名为BasicActionBar,包名为com.stylingandroid.basicactionbar,最低版本要求3.0(API 11)。如果你用ADT 20引入的创建项目向导(最近,在写这篇文章的时候),我们将会创建一个 空白activity 叫做MainActivity、layout叫做main、navigation type ( 导航类型)为none(ADT会自动为我们生成一些菜单,而我们想手动添加这样我们能了解需要哪些操作)、父控件分层(hierarchical parent)、设置ActionBar Demo 标题(title)。
这里的关键在于onCreateOptionsMenu的实现。之前我提及ActionBar是基于旧的Option Menu,这是允许一些向后的兼容。我们仍可以加入一些ActionBar的动作到低于3.0系统的设备,但它们将使用传统的Option Menu来展现(除非我们用ActionBarSherlock)。所以让我们看看菜单的定义,从res/menu/main.xml 载入:
让一个基本的ActionBar工作真的是很容易。ActionBar取代了一直存在于Android的Options Menu(选项菜单)所提供的功能,所以它扩展了现有的Options Menu框架,仅仅是对标准的Options Menu定义添加额外的参数。一个例子就可以说明这一点远比干解释要强,所以让我们新建一个项目:项目名为BasicActionBar,包名为com.stylingandroid.basicactionbar,最低版本要求3.0(API 11)。如果你用ADT 20引入的创建项目向导(最近,在写这篇文章的时候),我们将会创建一个 空白activity 叫做MainActivity、layout叫做main、navigation type ( 导航类型)为none(ADT会自动为我们生成一些菜单,而我们想手动添加这样我们能了解需要哪些操作)、父控件分层(hierarchical parent)、设置ActionBar Demo 标题(title)。
如果我们直接运行项目会看到如下界面:
可以看到有一个左侧有图标的标题栏——这就是ActionBar,目前为止我们什么也没做。如果我们点击右侧的垂直省略号(vertical ellipsis)即ActionBar的下拉菜单,我们将看到一个简单的settings选项:
这里所看到的都是ADT 20项目向导为我们创建的包含基本ActionBar的项目(如果你用的是早前的ADT版本你将看不到这些)。如果我们查看向导(wizard)为我们创建了什么,我们就会明白为什么会这样。首先让我们看看MainActivity.java:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
这里的关键在于onCreateOptionsMenu的实现。之前我提及ActionBar是基于旧的Option Menu,这是允许一些向后的兼容。我们仍可以加入一些ActionBar的动作到低于3.0系统的设备,但它们将使用传统的Option Menu来展现(除非我们用ActionBarSherlock)。所以让我们看看菜单的定义,从res/menu/main.xml 载入:
|
<menuxmlns:android="http://schemas.android.com/apk/res/android">
<itemandroid:id="@+id/menu_settings"
android:title="@string/menu_settings"
android:orderInCategory="100"
android:showAsAction="never"/>
</menu>
可以看到这个菜单定义由一个单一的item组成。id和title的设置一目了然,但另外两个属性是什么意思?通常菜单项会按它们定义时的顺序出现,orderInCategory允许你覆盖这个行为定义自己的顺序。对于ActionBar showAsAction是最关键的属性了,它可以控制菜单项在ActionBar上的放置位置和展现方式。这里设置成never意味着此菜单项不会直接展示在ActionBar上,但会一直出现在下拉菜单上。我不会不厌其烦的全面解释关于这个属性的所有可能值,因为在android开发者网站上它们已经在
Menu Resource
和
Adding Actions
里充分的覆盖到了。
目前为止我们还未将当用户点击菜单项和触发事件连接起来。但这仅仅是覆写onOptionsItemSelected就可以做到:
@Override
publicbooleanonOptionsItemSelected( MenuItem item )
{
booleanret;
if(item.getItemId() == R.id.menu_settings)
{
// Handle Settings
ret = true;
}
else
{
ret = super.onOptionsItemSelected( item );
}
returnret;
}
这就是我们如何用actionbar实现简单的动作,下篇文章我们将看到如何为actionbar添加导航。