3.9 技巧:创建一个下拉列表式的ActionBar
Android平板电脑开发秘籍
在下拉列表式ActionBar 中,Action项以下拉列表的形式显示出来。为了在ActionBar中显示下拉列表,请调用它的setNavigationMode()方法,把ActionBar.NAVIGATION_ MODE_LIST值作为参数传入,如下所示:
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
下拉列表以spinner方式显示一个可选项列表,用户只能从中选择一项。为了在下拉列表中显示Action项,将使用一个实现了SpinnerAdapter接口的适配器;比如,你可能会用ArrayAdapter、SimpleCursorAdapter 或任何BaseAdapter。在接下来要创建的应用程序中,将使用ArrayAdapter,因为它是最简单的适配器,可以作为Selection Widget的数据源来使用。可以按照以下步骤来创建应用程序。
(1)定义一个字符串数组,里面包含了需要显示在下拉列表中的字符串。
(2)创建一个ArrayAdapter,把数组中的元素显示为下拉列表项。也就是说,把数组元素封装或加入到spinner下拉列表项中。
(3)把ArrayAdapter赋给ActionBar,以显示Action项。为了把ArrayAdapter赋给ActionBar,并为显示出来的下拉项绑定事件侦听器,需调用setListNavigationCallbacks()方法,把适配器和OnNavigationListener作为参数传入,如下所示:
String[] items = new String[] { "Create", "Insert", "Update", "Search" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_dropdown_item, items);
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setListNavigationCallbacks(adapter, onNavigationItemSelected);
在上述代码中,定义了一个字符串数组items,里面包含了需要在下拉列表式ActionBar中显示的字符串。创建了名为adapter的ArrayAdapter,用于存放字符串数组项,并把数组元素加入到spinner下拉项中。
创建ActionBar对象actionBar,其导航模式设置为ActionBar.NAVIGATION_MODE_LIST。调用actionBar的setListNavigationCallbacks()方法,把ArrayAdapter、adapter和侦听器onNavigationSelected作为参数传入。给定了回调函数来处理下拉选择动作。如果用户在下拉列表中选择了一个Action项,将会调用事件处理方法onNavigationItemSelected,可以在里面编写代码来执行所需的动作。
下面尝试创建一个下拉列表式的ActionBar。首先创建一个名为ActionBarListApp的Android项目。在这个应用程序中,将以下拉列表的形式显示一些Action项。如果其中某项被选中,则相应的日志信息将会显示出来。请在Java Activity文件ActionBarListAppActivity.java中写下代码清单3-17所示的代码。
代码清单3-17 写入Java Activity 文件ActionBarListAppActivity.java的代码
package com.androidtablet.actionbarlistapp;
import android.os.Bundle;
import android.app.Activity;
import android.app.ActionBar.OnNavigationListener;
import android.app.ActionBar;
import android.widget.ArrayAdapter;
import android.util.Log;
public class ActionBarListAppActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String[] items = new String[] { "Create", "Insert",
"Update", "Search" };
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
this, android.R.layout.simple_spinner_dropdown_item, items);
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setListNavigationCallbacks(adapter,
onNavigationItemSelected);
}
OnNavigationListener onNavigationItemSelected = new
OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int itemPosition,
long itemId) {
Log.d("Option ", String.valueOf(itemId) +
" is selected");
return true;
}
};
}
这里,你会注意到,当某个下拉列表中的Action项被选中时,将会调用onNavigation ItemSelected()方法。onNavigationItemSelected()方法的itemPosition和itemId参数包含了选中项的位置和ID。日志信息,即所选Action项ID将会显示出来。ID是连续赋值给下拉列表中的Action项的,起始值为0。为了启用ActionBar,请不要忘记把AndroidManifest.xml文件中的android:minSdkVersion属性值设置为11以上。
运行此应用程序,可以看到一个Spinner,如图3-9a所示。Spinner将显示下拉列表中的第一个选项:Create。默认的样式会把第一项显示为黑色,这在黑色的背景色下几乎是看不见的。请打开res/values文件夹中的styles.xml文件,添加一个名为MyActionBar的自定义Style,语句如下:
图3-9 Spinner的第一项几乎看不见(a),Spinner的第一项可以看清了(b),
选中列表后显示所有的Action项(c),被选中的列表项显示为第一项(d)
添加完Style后,styles.xml文件将会如代码清单3-18所示。
代码清单3-18 写入styles.xml文件的代码
<resources >
<style name="AppBaseTheme" parent="android:Theme.Light" >
</style>
<style name="AppTheme" parent="AppBaseTheme">
</style>
<style name="MyActionBar" parent="@android:style/Widget.
Holo.Light.ActionBar" />
</resources>
为了在应用程序中应用这个Style,请打开AndroidManifest.xml文件,并把android:theme属性值设置如下:
android:theme="@style/MyActionBar"
这条语句将样式MyActionBar应用到应用程序中。现在屏幕输出将会如图3-9b所示。
当你点击Spinner时,将会打开一个下拉列表,所有的可选Action项将会显示出来(见图3-9c)。选中Action项Update,它将显示为Spinner的第一项(见图3-9d),以告知用户它被选中了。
图3-10给出了从下拉列表选中Update和Create Action项之后的日志信息。利用onNavigationItemSelected()方法的itemId参数把选中下拉项的ID显示出来。