Android Action Bar 详解篇

news/2024/7/4 1:31:25

          作为Android 3.0之后引入的新的对象,ActionBar可以说是一个方便快捷的导航神器。它可以作为活动的标题,突出活动的一些关键操作(如“搜索”、“创建”、“共享”等)、作为菜单的灵活使用,还可以实现类似TabWidget的标签功能以及下拉导航的功能,系统能够很好根据不同的屏幕配置来适应ActionBar的外观,配合起Fragemtn可谓是十分强大。

          那么,对于今天的主角ActionBar怎么去添加?在Android3.0默认主题HloleFraphic(全息)主题中,已经创造了ActionBar,所以只要targetSdkVersion的值不低于11,创建的Activity中默认都会带有ActionBar例如:

[html]  view plain copy
  1. <manifest ... >    
  2.     <uses-sdk android:minSdkVersion="4"  
  3.               android:targetSdkVersion="11" />    
  4.     ...    
  5. </manifest>  

          当然了,如果你不想为一个特定的Activity设置Action Bar,设置Activity主题为Theme.Holo.NoActionBar。

[html]  view plain copy
  1. <activity android:theme="@android:style/Theme.Holo.NoActionBar">  


           或者在运行时通过调用hide()隐藏Action Bar。自然也有show()。

[html]  view plain copy
  1. ActionBar actionBar = getActionBar();    
  2. actionBar.hide();  


          下面我们从下拉导航视窗操作标签导航三个方面逐一讨论ActionBar

         第一,下拉导航

                    下拉导航最典型的应用场景就是在Google+中的使用,效果如下图:

          

图1;Google+                             图2:本文示例

实现此效果分如下几个步骤:

          1.初始化一个SpinnerAdapter 

[java]  view plain copy
  1. SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this,  
  2.                 R.array.action_list,  
  3.                 android.R.layout.simple_spinner_dropdown_item);  

  2.生成一个OnNavigationListener来响应ActionBar的菜单项点击操作

[java]  view plain copy
  1. /** 
  2.      * 在这里配合Fragment,实现不同的页面导航 
  3.      */  
  4.     OnNavigationListener mOnNavigationListener = new OnNavigationListener() {  
  5.   
  6.         @Override  
  7.         public boolean onNavigationItemSelected(int position, long itemId) {  
  8.             Fragment newFragment = null;  
  9.             switch (position) {  
  10.             case 0:  
  11.                 newFragment = new Fragment1();  
  12.                 break;  
  13.             case 1:  
  14.                 newFragment = new Fragment2();  
  15.                 break;  
  16.             case 2:  
  17.                 newFragment = new Fragment3();  
  18.                 break;  
  19.             default:  
  20.                 break;  
  21.             }  
  22.             getSupportFragmentManager().beginTransaction()  
  23.                     .replace(R.id.container, newFragment, strings[position])  
  24.                     .commit();  
  25.             return true;  
  26.         }  
  27.     };  

   3,将生成好的适配去和监听器塞给ActionBar

[java]  view plain copy
  1. actionBar = getActionBar();  
  2. actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);//导航模式必须设为NAVIGATION_MODE_LIST  
  3. actionBar.setListNavigationCallbacks(mSpinnerAdapter,  
  4.         mOnNavigationListener);  


     第二,操作视窗

          先上效果图

    

        图3                                                                             图4                                                                   图5

          在上面的操作视窗里,增加了一个用于搜索的可选菜单项以及分享和设置的两个自定义ActionProVider。那么如何在一个活动中,在已有的ActionBar上添加这些操作视窗。同创建可选菜单一样,定义options.xml的menu文件如下:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.   
  4.     <item  
  5.         android:id="@+id/menu_search"  
  6.         android:actionViewClass="android.widget.SearchView"  
  7.         android:icon="@drawable/ic_menu_search"  
  8.         android:showAsAction="ifroom"  
  9.         android:title="搜索"/>  
  10.     <item  
  11.         android:id="@+id/menu_share"  
  12.         android:actionProviderClass="android.widget.ShareActionProvider"  
  13.         android:showAsAction="never"  
  14.         android:title="分享"/>  
  15.     <item  
  16.         android:id="@+id/menu_setting"  
  17.         android:actionProviderClass="com.example.tabdemo.MyActionProvider"  
  18.         android:showAsAction="never"  
  19.         android:title="设置">  
  20.         <menu>  
  21.             <item  
  22.                 android:id="@+id/menu_theme"  
  23.                 android:actionProviderClass="com.example.tabdemo.MyActionProvider"  
  24.                 android:showAsAction="always|withText"  
  25.                 android:title="更换主题"/>  
  26.             <item  
  27.                 android:id="@+id/menu_system"  
  28.                 android:actionProviderClass="com.example.tabdemo.MyActionProvider"  
  29.                 android:showAsAction="always|withText"  
  30.                 android:title="系统设置"/>  
  31.         </menu>  
  32.     </item>  
  33. </menu>  

          仔细观察可以发现每个Item里都包含如下这两个属性:

[html]  view plain copy
  1. android:actionProviderClass="com.example.tabdemo...."  
[html]  view plain copy
  1. android:showAsAction=""  
          对于actionProviderClass属性用来指定一个构建视窗所使用的布局资源,除了使用 actionProviderClass指定外,还可以使用actionLayout 或者actionViewClass都可以。SearchView和ShareActionProvider都是系统自带的ActionProvider,MyActionProvider是我们要重写的,后面将会看到如何去自定义一个ActionProvider。

          showAsAction属性共有五个值:ifRoom、never、always、withText、collapseActionView,可以混合使用。


    ifRoom会显示在Item中,但是如果已经有4个或者4个以上的Item时会隐藏在溢出列表中。当然个
数并不仅仅局限于4个,依据屏幕的宽窄而定
    never永远不会显示。只会在溢出列表中显示,而且只显示标题,所以在定义item的时候,最好
把标题都带上。
    always无论是否溢出,总会显示。
    withTextwithText值示意Action bar要显示文本标题。Action bar会尽可能的显示这个
标题,但是,如果图标有效并且受到Action bar空间的限制,文本标题有可
能显示不全。
   collapseActionView  声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,
这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。
一般要配合ifRoom一起使用才会有效果。

          注: 当你的应用程序正在Android4.0(API 级别 14)或以上的版本上运行,那么还有一种叫做“分隔操作栏”的额外模式对action bar有效。当你启用分隔操作栏模式时,在屏幕的底部会显示一个独立的横条,用于显示Activity在窄屏设备(如竖屏手机)上运行时的所有操作项。这里我们不过过多描述,有兴趣自己去研究。

          就像加载menu一样,在activity的onCreateOptionsMenu方法里调用上述的xml文件:

[java]  view plain copy
  1. getMenuInflater().inflate(R.menu.options, menu);  
  2.   
  3. //搜索视窗,因为showAsAction="ifRoom",所以图三中出现了搜索按钮  
  4. SearchView searchView = (SearchView) menu.findItem(R.id.menu_search)  
  5.         .getActionView();  
  6.   
  7. //分享视窗,因为showAsAction="never",所以只能在溢出菜单中才看见到  
  8. ShareActionProvider mShareActionProvider = (ShareActionProvider) menu  
  9.         .findItem(R.id.menu_share).getActionProvider();  
  10. Intent shareIntent = new Intent(Intent.ACTION_SEND);  
  11. shareIntent.setType("image/*");  
  12. mShareActionProvider.setShareIntent(shareIntent);  
  13.   
  14. //设置视窗,MyActionProvider就是我们自定义的ActionProvider  
  15. MyActionProvider myactionprovider = (MyActionProvider) menu.findItem(  
  16.         R.id.menu_setting).getActionProvider();  
  17. return super.onCreateOptionsMenu(menu);  

          显然,当成功运行的时候,结果如图三,当点击搜索按钮时,搜索按钮立刻变成了如图四的样子,变成可折叠的操作视窗。

          如何自定义操作视窗,定义一个类MyActionProvider继承自ActionProvider,并实现它的两口回调函数即可。如下:

[java]  view plain copy
  1. /**  
  2.  * @ClassName: MyActionProvider  
  3.  * @Description: 自定义一个视窗操作器,实现构造函数和onCreateActionView即可 
  4.  * @author yuxianglong  
  5.  * @date 2013-7-11 下午3:13:44  
  6.  *   
  7.  */  
  8. public class MyActionProvider extends ActionProvider{  
  9.   
  10.     private Context context;  
  11.     private LayoutInflater inflater;  
  12.     private View view;  
  13.     private ImageView button;  
  14.     public MyActionProvider(Context context) {  
  15.         super(context);  
  16.         // TODO Auto-generated constructor stub  
  17.         this.context = context;  
  18.         inflater = LayoutInflater.from(context);  
  19.         view = inflater.inflate(R.layout.myactionprovider, null);  
  20.     }  
  21.   
  22.       
  23.     @Override  
  24.     public View onCreateActionView() {  
  25.         // TODO Auto-generated method stub  
  26.         button = (ImageView) view.findViewById(R.id.button);  
  27.         button.setOnClickListener(new View.OnClickListener() {  
  28.               
  29.             @Override  
  30.             public void onClick(View v) {  
  31.                 // TODO Auto-generated method stub  
  32.                 Toast.makeText(context, "是我,没错", Toast.LENGTH_SHORT).show();  
  33.             }  
  34.         });  
  35.         return view;  
  36.     }  
  37.   
  38. }  

          如此一来,只要在options.xml里直接引用。运行成功效果如图五,点击溢出菜单,设置按钮出来了,如果继续点下去,回调出它的子菜单,因为我们在options.xml里给自定义的ActionProvider分配了子菜单。


     第三,导航选项标签

          当你想要在一个Activity中提供导航选择标签时,使用操作栏的选项标签是一个非常好的选择(而不是使用TabWidget类),因为系统会调整操作栏选项标签来适应不同尺寸的屏幕的需要,在屏幕足够宽的时候,导航选项标签会被放到主操作栏中;当屏幕太窄的时候,选项标签会被放到一个分离的横条中。如图下:

   

          要使用选项标签在Fragmengt之间切换,选择一个选项标签时执行一个Fragment事务,布局里包含一个用于放置跟每个Fragment对象关联的选项标签的ViewGroup对象。该对象有一个资源ID,以便能够在选项标签的切换代码中能够引用它。Activity的布局文件activity_main.xml定义如下:

[html]  view plain copy
  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:id="@+id/container"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context=".MainActivity"  
  7.     tools:ignore="MergeRootFrame" />  
          这里的ViewGroup为FragmentLayout。Activity代码如下:

[java]  view plain copy
  1. /* 
  2. * @ClassName: MainActivity  
  3. * @Description: 继承自FragmentActivity,作为Fragment的holder-Activity使用, 
  4. *               实现TabListener接口,当切Tab的时候达到切换Fragment的效果 
  5. * @author yuxianglong  
  6. * @date 2013-7-11 下午7:40:35  
  7. * 
  8.  */  
  9. public class MainActivity extends FragmentActivity implements  
  10.         ActionBar.TabListener {  
  11.     private ActionBar actionBar;  
  12.   
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.         actionBar = getActionBar();  
  18.         actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);// 导航模式必须设为NAVIGATION_MODE_Tabs  
  19.   
  20.         // For each of the sections in the app, add a tab to the action bar.  
  21.   
  22.         actionBar.addTab(actionBar.newTab().setText(R.string.title_section1)  
  23.                 .setTabListener(this));  
  24.         actionBar.addTab(actionBar.newTab().setText(R.string.title_section2)  
  25.                 .setTabListener(this));  
  26.         actionBar.addTab(actionBar.newTab().setText(R.string.title_section3)  
  27.                 .setTabListener(this));  
  28.   
  29.     }  
  30.   
  31.   
  32.     @Override  
  33.     public void onTabSelected(ActionBar.Tab tab,  
  34.             FragmentTransaction fragmentTransaction) {  
  35.         // When the given tab isselected, show the tabcontents in the  
  36.         // //container view.  
  37.         Fragment fragment3 = null;  
  38.         Fragment fragment1 = null;  
  39.         Fragment fragment2 = null;  
  40.         switch (tab.getPosition()) {  
  41.         case 0:  
  42.             if (fragment1 == null) {  
  43.                 fragment1 = new Fragment1();  
  44.             }  
  45.             getSupportFragmentManager().beginTransaction()  
  46.                     .replace(R.id.container, fragment1).commit();  
  47.             break;  
  48.         case 1:  
  49.             if (fragment2 == null) {  
  50.                 fragment2 = new Fragment2();  
  51.             }  
  52.             getSupportFragmentManager().beginTransaction()  
  53.                     .replace(R.id.container, fragment2).commit();  
  54.             break;  
  55.         case 2:  
  56.             if (fragment3 == null) {  
  57.                 fragment3 = new Fragment3();  
  58.             }  
  59.             getSupportFragmentManager().beginTransaction()  
  60.                     .replace(R.id.container, fragment3).commit();  
  61.             break;  
  62.   
  63.         default:  
  64.             break;  
  65.         }  
  66.   
  67.     }  
  68.   
  69.     @Override  
  70.     public void onTabUnselected(ActionBar.Tab tab,  
  71.             FragmentTransaction fragmentTransaction) {  
  72.     }  
  73.   
  74.     @Override  
  75.     public void onTabReselected(ActionBar.Tab tab,  
  76.             FragmentTransaction fragmentTransaction) {  
  77.     }  
  78.   
  79. }  
          最后跑起来的效果如下:

          至此ActionBar的一些常见使用场景,我们就熟悉了,后面继续研究ActionBar的外观样式。



转载地址:http://blog.csdn.net/yuxlong2010/article/details/9299507



http://www.niftyadmin.cn/n/3648940.html

相关文章

[收藏]Microsoft 系统体系结构 v2.0

p.s.:要得到打包MSA2.0文档的请留言。MSA v2.0 有哪些新内容&#xff1f; 在平台产品更新以及客户和合作伙伴的反馈的基础上&#xff0c;Microsoft 系统体系结构有了进一步的发展。MSA v2.0 的新增内容包括&#xff1a;基于 Windows Server 2003 的新功能并对其充分加以利用 旨…

深度学习各类优化器大总结

一、优化算法设计原理 深度学习中的优化算法采用的原理是梯度下降法&#xff0c;即最小化目标函数 J ( θ ) J(\theta) J(θ)&#xff0c;最优化的求解过程&#xff0c;首先求解目标函数的梯度 ∇ J ( θ ) \nabla J(\theta) ∇J(θ)&#xff0c;然后将参数 θ \theta θ 向…

css 实现计数器_CSS计数器简介

css 实现计数器Counters are a big part of programming. They help keep tabs on loops by storing the number of times it’s been executed. Common variable names for increment counters are i, j and k. Before the days of modern CSS, keeping track of things on th…

23种模式之迭代器模式

场景 提供一种可以遍历聚合对象的方式。又称为&#xff1a;游标cursor模式。聚合对象&#xff1a;存储数据迭代器&#xff1a;遍历数据 迭代器接口 public interface MyIterator {void first(); //将游标指向第一个元素void next(); //将游标指向下一个元素boolean hasNext(…

javascript 代理_查看所有13个JavaScript代理陷阱

javascript 代理Proxies are a really cool JavaScript feature. If you like meta programming you probably are already familiar with them. In this article we are not going to get in to programming design patterns or get meta or even understand how proxies work…

Android 系统Action大全

常用Action说明&#xff1a; String ADD_SHORTCUT_ACTION 动作&#xff1a;在系统中添加一个快捷方式。. “android.intent.action.ADD_SHORTCUT”String ALL_APPS_ACTION 动作&#xff1a;列举所有可用的应用。 输入&#xff1a;无。 “android.intent.action.ALL_APPS”Strin…

23种设计模式之中介者模式

中介者模式本质 解耦多个部门对象之间的交互关系。每个对象都持有中介者对象的引用&#xff0c;只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系 android最常见的场景 MVC模式(其中的C)&#xff0c;控制器就是一个中介者对象。M和V都和它打交道 总经理接口:…

gatsby_使用gatsby-awesome-pagination在Gatsby中进行分页

gatsbyDespite Gatsby’s amazing performance, it would be best not to force the user to load every single post onto the same page. Instead, we’ll explore the gatsby-awesome-pagination plugin to segment our post archive into more manageable sections. 尽管Ga…