现在的位置: 首页 > 综合 > 正文

【译】ActionBar 基础3

2018年02月17日 ⁄ 综合 ⁄ 共 2489字 ⁄ 字号 评论关闭

        在上一篇文章中我们让基于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找到。

抱歉!评论已关闭.