ActionBar(3)起用各样式(基本,分离,tab,下拉列表)

一.基本样式

默认的就是

二.分离样式

当启用分隔操作栏模式时,在屏幕的底部会显示一个独立的横条,用于显示Activity在在窄屏设备(如竖屏手机)上运行时的所有操作项。

 把操作栏分隔成独立的操作项,确保在窄屏设备上有合适的空间来显示所有的操作项,同时把导航条和标题元素留在顶部。

 代码实现:在manifest.xml文件中的元素添加android:uiOptions="splitActionBarWhenNarrow"属性设置,启用分离式操作栏。

效果图如下:


三.tab样式

当你想要在一个Activity中提供导航选择标签时,使用操作栏的选项标签是一个非常好的选择(而不是使用TabWidget类),因为系统会调整操作栏选项标签来适应不同尺寸的屏幕的需要---在屏幕足够宽的时候,导航选项标签会被放到主操作栏中;当屏幕太窄的时候,选项标签会被放到一个分离的横条中,如图9和图10所示。
      
          图9. Honeycomb Gallery应用程序中的操作栏选项标签的截图
      
          图10. 在窄屏设备上被堆放在操作栏中的选项标签的截屏 

       要使用选项标签在Fragmengt之间切换,你必须在每次选择一个选项标签时执行一个Fragment事务。如果你不熟悉如何使用FragmentTransaction对象来改变Fragment,请阅读Fragment开发指南。

       首先,你的布局必须包含一个用于放置跟每个Fragment对象关联的选项标签的ViewGroup对象。并且要确保这个ViewGroup对象有一个资源ID,以便你能够在选项标签的切换代码中能够引用它。另外,如果选项标签的内容填充在Activity的布局中(不包括操作栏),那么Activity不需要任何布局(你甚至不需要调用setContentView()方法)。相反,你能够把每个Fragment对象放到默认的根ViewGroup对象中,你能够用android.R.id.content ID来引用这个ViewGroup对象(在Fragment执行事务期间,你能够在下面的示例代码中看到如何使用这个ID的。

        决定了Fragment对象在布局中的显示位置后,添加选项标签的基本过程如下:

          1.  实现ActionBar.TabListener接口。这个接口中回调方法会响应选项标签上的用户事件,以便你能够切换Fragment对象;

           2.  对于每个要添加的选项标签,都要实例化一个ActionBar.Tab对象,并且调用setTabListener()方法设置ActionBar.Tab对象的事件监听器。还可以用setText()或setIcon()方法来设置选项标签的标题或图标。

         3.  通过调用addTab()方法,把每个选项标签添加到操作栏。

        在查看ActionBar.TabListener接口时,注意到回调方法只提供了被选择的ActionBar.Tab对象和执行Fragment对象事务的FragmentTransaction对象---没有说明任何有关Fragment切换的事。因此。你必须定义自己的每个ActionBar.Tab之间的关联,以及ActionBar.Tab所代表的适合的Fragment对象(为了执行合适的Fragment事务)。依赖你的设计,会有几种不同的方法来定义这种关联。在下面的例子中,ActionBar.TabListener接口的实现提供了一个构造器,这样每个新的选项标签都会使用它自己的监听器实例。每个监听器实例都定义了几个在对应Fragment对象上执行事务时必须的几个成员变量。

       例如,以下示例是ActionBar.TabListener接口的一种实现,在这个实现中,每个选项标签都使用了它自己的监听器实例:

[java] view plaincopyprint?
  1. public static class TabListenerextends Fragment> implements ActionBar.TabListener {  
  2.     private Fragment mFragment;  
  3.     private final Activity mActivity;  
  4.     private final String mTag;  
  5.     private final Class mClass;  
  6.   
  7.     /** Constructor used each time a new tab is created. 
  8.       * @param activity  The host Activity, used to instantiate the fragment 
  9.       * @param tag  The identifier tag for the fragment 
  10.       * @param clz  The fragment's Class, used to instantiate the fragment 
  11.       */  
  12.     public TabListener(Activity activity, String tag, Class clz) {  
  13.         mActivity = activity;  
  14.         mTag = tag;  
  15.         mClass = clz;  
  16.     }  
  17.   
  18.     /* The following are each of the ActionBar.TabListener callbacks */  
  19.   
  20.     public void onTabSelected(Tab tab, FragmentTransaction ft) {  
  21.         // Check if the fragment is already initialized  
  22.         if (mFragment == null) {  
  23.             // If not, instantiate and add it to the activity  
  24.             mFragment = Fragment.instantiate(mActivity, mClass.getName());  
  25.             ft.add(android.R.id.content, mFragment, mTag);  
  26.         } else {  
  27.             // If it exists, simply attach it in order to show it  
  28.             ft.attach(mFragment);  
  29.         }  
  30.     }  
  31.   
  32.     public void onTabUnselected(Tab tab, FragmentTransaction ft) {  
  33.         if (mFragment != null) {  
  34.             // Detach the fragment, because another one is being attached  
  35.             ft.detach(mFragment);  
  36.         }  
  37.     }  
  38.   
  39.     public void onTabReselected(Tab tab, FragmentTransaction ft) {  
  40.         // User selected the already selected tab. Usually do nothing.  
  41.     }  
  42. }  

       警告:针对每个回调中的Fragment事务,你都不必调用commit()方法---系统会调用这个方法,并且如果你自己调用了这个方法,有可能会抛出一个异常。你也不能把这些Fragment事务添加到回退堆栈中。

在这个例子中,当对应的选项标签被选择时,监听器只是简单的把一个Fragment对象附加(attach()方法)到Activity布局上---或者,如果没有实例化,就会创建这个Fragment对象,并且把它添加(add()方法)到布局中(android.R.id.content ViewGroup的一个子类),当这个选项标签解除选择时,对应的Fragment对象也会被解除与布局的依附关系。

       ActionBar.TabListener的实现做了大量的工作,剩下的事情就是创建每个ActionBar.Tab对象并把它添加到ActionBar对象中,另外,你必须调用setNavigationMode(NAVIGATION_MODE_TABS)方法来让选项标签可见。如果选项标签的标题实际指示了当前的View对象,你也可以通过调用setDisplayShowTitleEnabled(false)方法来禁用Activity的标题。

       例如,下面的代码使用上面定义的监听器在操作栏中添加了两个选项标签。

[java] view plaincopyprint?
  1. @Override  
  2. protected void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     // Notice that setContentView() is not used, because we use the root  
  5.     // android.R.id.content as the container for each fragment  
  6.   
  7.     // setup action bar for tabs  
  8.     ActionBar actionBar = getActionBar();  
  9.     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);  
  10.     actionBar.setDisplayShowTitleEnabled(false);  
  11.   
  12.     Tab tab = actionBar.newTab()  
  13.             .setText(R.string.artist)  
  14.             .setTabListener(new TabListener(  
  15.                     this"artist", ArtistFragment.class));  
  16.     actionBar.addTab(tab);  
  17.   
  18.     tab = actionBar.newTab()  
  19.         .setText(R.string.album)  
  20.         .setTabListener(new TabListener(  
  21.                 this"album", AlbumFragment.class));  
  22.     actionBar.addTab(tab);  
  23. }  

        注意:以上有关ActionBar.TabListener的实现,只是几种可能的技术之一。在API Demos应用中你能够看到更多的这种样式。

        如果Activity终止了,那么你应该保存当前选择的选项标签的状态,以便当用户再次返回时,你能够打开合适的选项标签。在保存状态的时刻,你能够用getSelectedNavigationIndex()方法查询当前的被选择的选项标签。这个方法返回被选择的选项标签的索引位置。

       警告:保存每个Fragment所必须的状态是至关重要的,因为当用户用选项标签在Fragment对象间切换时,它会查看Fragment在离开时样子。

       注意:在某些情况下,Android系统会把操作栏选项标签作为一个下拉列表来显示,以便确保操作栏的最优化显示。


四.下拉列表样式

作为Activity内部的另一种导航(或过滤)模式,操作栏提供了内置的下拉列表。下拉列表能够提供Activity中内容的不同排序模式。

       启用下拉式导航的基本过程如下:

         1.  创建一个给下拉提供可选项目的列表,以及描画列表项目时所使用的布局;

         2.  实现ActionBar.OnNavigationListener回调,在这个回调中定义当用户选择列表中一个项目时所发生的行为;

         3.  用setNavigationMode()方法该操作栏启用导航模式,如:

[java]  view plain copy print ?
  1. ActionBar actionBar = getActionBar();  
  2. actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);  

        4.  用setListNavigationCallbacks()方法给下拉列表设置回调方法,如:

[java]  view plain copy print ?
  1. actionBar.setListNavigationCallbacks(mSpinnerAdapter, mNavigationCallback);  

这个方法需要SpinnerAdapter和ActionBar.OnNavigationListener对象。下面是 SpinnerAdapter and ActionBar.OnNavigationListener 的例子。

 Example SpinnerAdapter and OnNavigationListener


效果图如下:


你可能感兴趣的:(ActionBar)