在上一篇文章中我们让基于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”条目和
)。由此我们创建一个使用标准的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:
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)关于它提供了一些优秀的信息。
coarser-grained navigation back up your app’s hierarchical structure)。官方的文档(official
documentation)关于它提供了一些优秀的信息。
下篇文章,我们将转移注意力到当标准的动作和导航没有提供我们需要的UI的时候,我们可以使用ActionBar的方式。