【译】ActionBar 基础3

本文介绍如何在ActionBar中创建基于下拉的导航。首先设置导航模式并移除标题以留出空间给Spinner,接着创建SpinnerAdapter并设置回调处理导航。演示了如何在用户选择下拉列表项时替换显示的Fragment。
         在上一篇文章中我们让基于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 找到。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值