ActionBar应用开发讲解

1.    什么是操作栏(ActionBarandroid3.0及之后的版本添加的新特性):

 

    1) ActionBar是一个显示在屏幕顶部的控件,它包括了在左边显示的应用的logo图标和右边操作菜单的可见项。

    2)  我们可以选择可见的操作菜单可见项,不可见项会以下拉列表的形式呈现出来。

    3) ActionBar同时也为Fragment之间提供标签导航。

 

2.    操作栏的主要目的:

     i.         为了标识应用程序的商标和用户的位置而提供的一个专用空间。

    ii.         在不同的应用程序之间提供一致的导航和视觉体验。

   iii.         突出Activity的关键操作(如搜索创建共享,等),并且在可预见的方法内给用户提供快捷的访问。

如上图应用中的操作栏所示:从左边开始,依次是logo、导航选项标签和操作项(在右边插入的一个溢出菜单按钮)。

  注:此处的溢出菜单按钮是在添加过多的操作项时,而操作栏中没有足够的空间放置,系统会自动生成。值得注意的是,android4.0系统有虚拟键盘。也就是说,在手机硬件屏幕下方没有物理menua按钮时,才会自动生成溢出菜单栏,否则,溢出菜单不会自动生成,其余的操作项也只能通过物理menu按钮展现

 

3.    ActionBar的应用开发:

 

添加ActionBar:

 

1)     在实际应用开发者中,不需要导入ActionBar,因为在android3.0或者以上的版本中,ActionBar已经默认的包含在Activity中。

2)     从android3.0开始,ActionBar被包含在所有使用Theme.Holo主题的Activity中。

3)     当android:minSdkVersion或者android:targetSdkVersion属性被设置成11或者更高时,应用会被认为是android3.0版本(默认含有ActionBar)

4) 通过设置ActionBar的serDisplayShowHomeEanbled(false)和setDisplayShowTitleEanbled(fasle)禁用操作栏的图标和标题;

 

去除ActionBar:

 

1)     如果需要在自己开发的Acitivity中无操作栏,可以通过把主题设置为Theme.Holo.NoActionBar去除掉ActionBar,如:

<activity android:theme=”@android:style/Theme.Holo.NoActionBar”>

2)     同时也可以通过代码调用其hide()方法来实现,如下:

getActionBar.hide()当操作栏隐藏时,系统会调整Activity来填充当前有效的屏幕空间,可以通过getActionBar.show()来再次显示操作栏。

 

添加操作项(Action Item):

 

用户可以通过菜单栏中的操作项直接访问所需资源,操作项能够包含一个图标或文本标题。如果一个菜单项不能作为一个操作项显示,那么系统就会把它放到溢出菜单中。用户可以通过点击溢出菜单按钮显示其余的菜单。

可以这么理解,Action Item其实就是之前的旧版本中的MenuItem,只不过把它整合到ActionBar中了。所以,当系统首次启动时,系统会调用onCreateOptionsMenu()方法给Activity的ActionBar添加操作栏和溢出菜单。

通过代码添加操作栏:

    在Activity中重写onCreateOptionsMenu(Menu menu)方法:

   我们知道,菜单项是有图标和文本标题的,在代码中,通过setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)请求把一个菜单项作为一个操作项来显示。用这种方式,只有在有效的空间时,菜单项才能显示在操作栏中。如果没有足够的空间,这个菜单项会显示在溢出菜单中。

   如果你的菜单项支持标题和图标,那么默认情况下,操作项仅显示图标。如果你要显示文本标题,就要添加如下属性setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM|MenuItem.SHOW_AS_ACTION_WITH_TEXT)

    注:MenuItem.SHOW_AS_ACTION_WITH_TEXT值示意操作栏要显示文本标题。操作栏会尽可能的显示这个标题,但是,如果图标有效并且受到操作栏空间的限制,文本标题有可能显示不全。

   通过加载xml文件添加操作栏:

     在Activity中重写onCreateOptionsMenu(Menu menu)方法:

    

    menus.xml文件代码:

    

   在xml文件中,同样可以通过给<item>元素声明android:showAsAction=””(如android:showAsAction=”ifRooms”)属性实现操作项的属性(代码中通过setShowAsAction()方法设置)。

   当用户选择一个菜单时。Activity会接收一个onOptionsItemSelected()回调,要把android:id属性支持的ID传递给这个方法。

   给每个菜单项定义android:title属性是至关重要的,即使你没有给操作项声明标题,原因如下:

a)     如果操作栏中没有足够的空间来显示操作项,那么菜单项就会显示在溢出菜单中,并仅显示标题

b)     屏幕阅读器要给视障用户朗读菜单项标题;

c)     如果仅用图标来显示操作项,那么,用户能够长按这个项目,用操作项的标题来显示提示信息。

 

使用分离式操作栏:

 

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

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

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

效果图如下:

 

使用应用程序图标导航:

 

  在上面的效果图的应用程序图标左侧会出现一个示意向左的箭头标,也就是说,应用图标可以当做操作项来使用。应用程序在这个图标上响应以下两个操作之一:

   1.   返回应用程序的“主”Activity必须调用setHomeButtonEnabled(true)方法

     例如,下列的onOptionsItemSelected()方法实现了返回应用程序的主Activity的操作

   上面的代码,当用户触摸应用程序图标时,会走onOptionsItemSelected()方法。android.R.id.home 为点击ActionBar对应的图标资源id;在case android.R.id.home这个响应中,你可以做任何你想做的事情,上面的代码是处理返回主Activity;

   注:Intent对象中要使用FLAGE_ACTIVITY_CLEAR_TOP标识,如果当前页面跳转到主Activity或者前一个Activity,那么所有在其上的activity都会被销毁,然后主Activity或前一个Activity回到栈顶,而不用从新再创建已存在在堆栈中的Activity的新实例。

  如果不设置这个标识,当向上导航后,再按回退按钮,实际上会转到下级界面,而不是返回到原来的界面或者手机桌面。

  还有一种情况,在用户从另一个应用程序进入当前的Activity的情况下,你可能需要添加FLAG_ACTIVITY_NEW_TASK标识。这个标识确保在用户返回主页或上级页面时,新的Activity不会被添加到当前任务中,而是在属于你自己的应用程序的任务中启动。例如,如果用户通过被另一个应用程序调用的Intent对象启动了你的应用程序中的一个Activity,那么选择操作栏图标来返回主页或上级页面时,FLAG_ACTIVITY_CLEAR_TOP标识会在属于你的应用程序的任务中启动这个Activity(不是当前任务)。系统既可以用这个新的Activity做根Activity来启动一个新的任务,也可以把存在后台的拥有这个Activity实例的一个既存任务带到前台来,并且目标Activity会接受onNewIntent()回调。因此,如果你的Activity要接收另一个应用程序的Intent对象,那么通常应该给这个Intent对象添加FLAG_ACTIVITY_NEW_TASK标识,如:intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);

2.  向应用程序上级页面导航

  要使应用程序图标能够向上导航,就要在ActionBar中调用setDisplayHomeAsUpEnabled(true)方法。

 

添加操作视窗:

 

1.     可以添加一个视图作为一个Action Item。通过在xml元素的android:actionLayout属性制定我们希望现实布局资源的ID(例如@layout/mysearchview)

2.     也可以选择添加android:actionViewClass属性(menus.xml文件中<item>的属性)分配与完全限定的类名描述我们想要显示的视图(例如android:actionViewClass=”android.widget.SearchView”)

  android.widget.SearchView是系统内置的搜索框视图,效果图如下:

  上图为折叠和展开的搜索视窗的操作栏

        通过给android:showAsAction属性添加“collapseActionView”属性值,能够让操作视窗可以折叠起来。如果需要,同时也可以在代码中通过expandActionView()collapseActionView()方法来展开或折叠操作视窗。

 

添加导航选项标签(tab选项):

 

1.    ActionBar可以现实选项卡供用户切换浏览该Activity中不同的Fragment

注:添加导航选项标签,必须给调用ActionBarsetNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

2.    每个标签都可以是一个图标或文本标题

要使用选项标签在Fragmengt之间切换,必须在每次选择一个选项标签时执行一个Fragment事务。

 添加选项标签的基本过程如下:

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

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

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

 在实现ActionBar.TabListener接口的类中必须重写onTabSelected()onTabUnselected()onTabReselected()方法来关联Fragment,在这三个方法中实现Tab标签被选中、非选中、重新选中时是所需处理的事务操作。

效果图如下:

 

添加下拉式导航:

 

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

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

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

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

3.    调用setNavigationMode(ActionBar.NAVIGATION_MODE_LIST)方法启用操作栏下拉式导航模式。

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

     actionBar.setListNavigationCallbacks(mSpinnerAdapter,mNavigationCallback);

    这个方法需要SpinnerAdapterActionBar.OnNavigationListener对象作为参数。

    mSpinnerAdapter作为适配器加载导航列表中所需要的列表选项布局资源。

     mNavigationCallback实现ActionBar.OnNavigationListener接口,覆写onNavigationItemSelected()方法,

    通过该方法实现处理点击相应的下拉导航菜单选项的响应。

效果图如下:

 

添加共享组件:

 

 在ActionBar里实现一个高效的分享操作变得更简单了。ActionProvider,一旦附加到一个ActionBar的菜单项后,可以同时处理此菜单项的外观和行为。在ShareActionProvider中,你只需要提供一个intent对象,剩下的操作就由它来替你完成。、

1.     更新菜单的声明:

我们在菜单资源文件里定义带有一个android:actionProviderClass 属性的item,如下的代码片段:

这个代理类负责ShareActionProvider的外观及功能。然而你仍然需要告知provider你想要分享什么东西。

2.     设置Share Intent

   使用ShareActionProvider,必须提供一个intent,同时这个intent需要声明ACTION_SEND和表示数据的extras(如EXTRA_TEXT、 EXTRA_STREAM);

   指定一个share intent时,首先要找到相应的MenuItem,同时将Activity或者是Fragment中的菜单资源展开。然后,调用MenuItem.getActionProvider()获取一个ShareActionProvider的实例,再调用setShareIntent()分享与那个action item相关联的share intent。

代码片段如下:

   需要注意是,如果一个应用程序需要接受Share Intent发送的共享数据,那么需要在该应用程序的Manifest.xml文件中定义<intent-filter/>元素,指明应用组件想要接受的intent。例如,针对上面发送的共享数据,另一个接收数据应用的Manifest.xml文件应注册intent-filter如下:

    在给应用的Manifest.xml注册相关的intent-filter后,在ShareActionProvider相关联的Action Item里将出现相应的该应用可供选择共享图标及标题;

下图为效果图:

 

上下文操作栏(ContextActionBar)

 

  上下文操作栏不比跟操作栏关联,它们独立地操作,上下文操作栏甚至可以显示在操作栏位置之上。

对于那些提供上下文操作的View对象,你通常应该在以下两种事件之上调用上下文操作模式:

1. 用户在View对象上执行一个长按(long-click)操作。

2. 用户选择了一个复选框或View对象中类似复选框的UI组件。

 

应用程序如何调用上下文操作模式,并给每个操作定义行为,依赖于你的设计。有以下两种基本的设计:

1.    针对个别的、任意的View对象的上下文操作:

     i.         实现ActionMode.Callback接口。在它的回调方法中,你能够针对上下文操作栏指定动作,在操作项目上响应点击事件和处理针对这个操作模式的其他生命周期事件。

 

    ii.         在显示这个操作栏时,调用startActionMode()方法,参数为实现ActionMode.Callback接口类的对象(如用户长按(long-click)对应的view对象时,调用该方法显示上下文操作栏)。

如:

       a)  实现ActionMode.Callback接口:

       

       b)  在适当的时机调用startActionMode()方法启用上下文操作模式,如在响应一个View对象(Button)的长按事件时:

      

     当调用startActionMode()方法时,系统返回被创建的ActionMode对象。通过把这个对象保存在一个成员变量中,能够在对其他事件的响应中对上下文菜单进行改变。

   效果图如下:

  

2. 针对ListViewGridView对象中项目组的批处理上下文操作(允许用户选择多个项目,并这些选择的项目上执行一个操作):

   如果在ListView或GridView对象(或是另外的AbsListView类的扩展)中有一个项目的集合,并且想要允许用户对其执行批处理操作,那么应该按如下的方法:

    i.         实现AbsListView.MultiChoiceModeListener接口,并且要用setMultiChoiceModeListener()方法把它设置给ViewGroup对象。在这个监听器的回调方法中,你能够给这个上下文操作栏指定动作,响应在操作项目上的点击事件,并且处理从ActionMode.Callback接口中继承来的其他回调方法。

   ii.         ViewGroup对象调用带有CHOICE_MODE_MULTIPLE_MODAL参数的setChoiceMode()方法。

   当用户用长按事件选择一个项目时,系统会调用onCreateActionMode()方法,并显示带有特定操作的上下文操作栏。同时在上下文操作栏显示时,用户还能继续选择其他的项目。

  效果图如下:

   

接口回调方法讲解:

onItemCheckedStateChanged :处于选择模式,一个选项被选择或取消选择时此方法被调用。

onActionItemClicked:用户点击一个动作按钮时调用

onCreateActionMode:上下文操作模式第一次被创建时调用

onDestroyActionMode:当一个上下文操作模式被退出或销毁时调用

onPrepareActionMode:当一个上下文操作模式的动作菜单无效时,将其重新刷新时调用

 

本文 相关的Demo代码下载:http://download.csdn.net/detail/stevenhu_223/4613789

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值