在上一篇文章中我们让基于tab的导航起作用了。基于tab的导航在两个或三个的导航项的时候可以很好的工作,但当导航项很多的时候就没那么好了。基于下拉的导航在
导航项
略微多的情况下更佳适合,本文将介绍如何在我们的ActionBar中创建基于下拉的导航。
在Google Maps 中可以看到基于下拉的导航的例子:
这个导航在ActionBar中作为Spinner出现,Spinner的下拉列表中包含导航选项。在基于tab的导航
适应所有这些选项将会 极其的困难。
运用基于下拉的导航我们首先要设置ActionBar的导航模式和移除标题以便有足够的空间留给spinner:
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
actionBar.setTitle( "" );
接着我们要创建一个SpinnerAdapter:
finalList<Map<String, Object>> data =
newArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", getString( R.string.frag1 ) );
map.put("fragment", Fragment.instantiate( this,
Fragment1.class.getName() ));
data.add( map );
map = new HashMap<String, Object>();
map.put("title", getString( R.string.frag2 ) );
map.put("fragment", Fragment.instantiate( this,
Fragment2.class.getName() ));
data.add( map );
SimpleAdapter adapter = new SimpleAdapter( this, data,
android.R.layout.simple_spinner_dropdown_item,
newString[] { "title" },
newint[] { android.R.id.text1 } );
这段代码创建了一个Map对象列表,每个map包含两个条目:
“title”(
将会在spinner中显示的文本)和
“fragment”(
当spinner项被选中后展示的Fragment )。由此我们创建一个使用标准的Android Spinner下拉布局的SimpleAdapter实例,(在
here可以看到,然道你不只是喜欢开源吗?
)并将列表中的每一个Map的“title”条目和
出现在布局中的一个TextView组件匹配起来。
SimpleAdapter是SpinnerAdapter的一个子类,对于结合静态的内容是很有用的。在现实世界中的应用程序你可能想要运用其他类型的Adapter。为了让事情简单和容易理解,我在这里使用它。
现在我们有了我们的SpinnerAdapter,我们需要将它和
OnNavigationListener一起
设置到ActionBar
来处理导航的回调。当用户更改选择时将会调用它:
actionBar.setListNavigationCallbacks( adapter,
newOnNavigationListener()
{
@Override
publicbooleanonNavigationItemSelected(
intitemPosition,
longitemId )
{
Map<String, Object> map =
data.get( itemPosition );
Object o = map.get( "fragment" );
if( o instanceof Fragment )
{
FragmentTransaction tx =
getFragmentManager().beginTransaction();
tx.replace( android.R.id.content,
(Fragment )o );
tx.commit();
}
returntrue;
}
}
);
每当用户选择Spinner下拉列表的选项时onNavigationItemSelected方法将会被调用。它从我们创建SpinnerAdapter时添加的数据中获得Fragment实例,然后用适当的Fragment替换我们Activity的内容区域。
现在运行我们将看到如下内容:
可以工作,但是Spinner上的文本很暗。原因是由ADT 20 新项目创建向导为Android 4.0和更新版本创建了默认主题所造成的。为ActionBar更换主题和样式会有一些棘手,并且将是以后的文章的主题。现在我们将仅仅通过使用标准的Holo.Light来更换主题。所以我们要更改 res/values-v14/styles.xml:
<resources>
<stylename="AppTheme"
parent="android:Theme.Holo.Light"/>
</resources>
现在,有一个亮一点的ActionBar,一切看起来都很好:
值得记住的一件事是ActionBar也提供了Home(首页)或Up(向上)功能通过点击在左侧的logo。返回键通过用户的历史提供应用程序的导航。而Home/Up提供一个粗粒度的导航备份你的应用程序的层次结构(
a coarser-grained navigation back up your app’s hierarchical structure
)。官方的文档(
official documentation
)关于它提供了
一些优秀的信息。
下篇文章,我们将转移注意力到
当标准的动作和导航没有提供我们需要的UI的时候,
我们可以使用ActionBar的方式。