【译】ActionBar 基础3

来源:互联网 发布:葡萄牙语翻译软件 编辑:程序博客网 时间:2024/06/05 04:56
        在上一篇文章中我们让基于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的方式。
   
      本篇文章的代码可以在 here找到。