概述
ActionBar,也被称作App Bar,是一个安卓应用程序的一个标准模块,(导航元素),一个Action Bar有以下组成
- 一个application图标
- 一个向上的导航,指向逻辑父activity
- 一个application或者activity标题
- activity主要的图标
- 一致的导航(包括navigation drawer )
需要注意的是在3.0之前没有ActionBar。2013年,Google发布了一个支持库,提供了为老版本更好的兼容性,并且支持平板设备。因此下面大部分的例子都依赖于这个支持库,所以请引入AppCompat library.。
基本的ActionBar
每个应用除非特别说明,都有默认的一个ActionBar,默认的ActionBar的标题就是当前activity的名字。
改变ActionBar的标题
ActionBar的标题展示在屏幕的顶部,被清单文件的activity 节点所管理。在下面的例子里,FirstActivity会有一个ActionBar,名字是@string/activity_name。注意:application 节点可以有android:label 作为默认,如果activity没有label属性,就会调用activity的lable属性。
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">
<activity
android:name="com.codepath.example.simpleapp.FirstActivity"
android:label="@string/activity_name" >
</activity>
</application>
如果你改变android:label 或者android:icon ,就可以改变activity或者整个application的ActionBar的标题和图标。你也可以调用getSupportActionBar()去活的ActionBar的引用,在运行的时候动态改变ActionBar的属性。
ActionBar actionBar = getSupportActionBar(); // or getActionBar();
getSupportActionBar().setTitle("My new title"); // set the top title
String title = actionBar.getTitle().toString(); // get the title
actionBar.hide(); // or even hide the actionbar
你可以改变更多的属性,下一篇会详细介绍。
在新的5.0material 设计规范里,不推荐在ActionBar里使用图标,但你还是可以添加图标
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setLogo(R.mipmap.ic_launcher);
getSupportActionBar().setDisplayUseLogoEnabled(true);
上面的结果是
你可以阅读 material design guidelines,里面有谈到“在API21之后,不推荐应用图标+title作为基本的布局”
增加动作条目(Action Item)
如果说你想在ActionBar里增加主要的Action,你把条目加入到目录里,如果合适的编写,他们就会自动的以图标的形式显示在ActionBar的右边。
public class MainActivity extends AppCompatActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
}
ActionBar 里的实体通常被成为动作,用这个方法去填充一个菜单资源文件,在这个资源文件里定义了许多动作,例如
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/miCompose"
android:icon="@drawable/ic_compose"
app:showAsAction="ifRoom"
android:title="Compose">
</item>
<item
android:id="@+id/miProfile"
android:icon="@drawable/ic_profile"
app:showAsAction="ifRoom|withText"
android:title="Profile">
</item>
</menu>
你会注意到了,xmlns:app命名空间必须被指定,因为我们要用showAsAction 选项。原因是:适配库需要用它去支持showAsAction=”ifRoom”选项。这个选项很重要,可以把我们menu里的item以图标的形式显示,如果ActionBar里面没有位置了,就会显示在三个点里面,想必大家都见过。
下面就是我们上面代码的例子
注意:@drawable/ic_compose 和@drawable/ic_profil资源在编译的时候必须存在。为了生成ActionBar icons,请使用Android Studio 的Asset Studio。在res/drawable 文件夹右击New -> Image Asset.
处理点击事件
两种方法可以,一是在xml里进行配置
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/item1"
android:icon="@drawable/ic_compose"
android:onClick="onComposeAction"
app:showAsAction="ifRoom"
android:title="Compose">
</item>
</menu>
然后定义相对应名字的方法就行
public class MainActivity extends AppCompatActivity {
public void onComposeAction(MenuItem mi) {
// handle click here
}
}
第二种方法就是使用onOptionsItemSelected() 。如何去知道是哪一个menu被点击了呢?调用getItemId()方法就能获得标签的id选项
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.miCompose:
composeMessage();
return true;
case R.id.miProfile:
showProfileView();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
理解ToolBar
ToolBar在Android L中被引用,在API21中被认为是ActionBar很好的继任者。
ToolBar是一个可以在你布局文件中任意放置的一个ViewGroup 。ToolBar可以更容易的被自定义。
在API21之后ToolBar可以很好的工作,安卓也更新了AppCompat 去支持ToolBar在之前的设备商运行。在AppCompat 里,ToolBar是android.support.v7.widget.Toolbar的实现类。我会写一篇文章在介绍ToolBar的。