ActionBar

 在Android3.0以上你可以利用Action Bar部件提供的全部功能,将你的选项菜单项放在Action Bar的右上角,对用户来说使用更方便,控制该行为的主菜单项属性是android:showAsAction。

这个属性可接受的值有:

1、always:这个值会使菜单项一直显示在Action Bar上。

2、ifRoom:如果有足够的空间,这个值会使菜单项显示在Action Bar上。

3、never:这个值使菜单项永远都不出现在Action Bar上, 但是该菜单项会出现在平常的菜单中

4、withText:这个值使菜单项和它的图标,菜单文本一起显示。

 

Adding an Action Provider

1. 设置菜单,加上属性

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/menu_share"
          android:title="@string/share"
          android:showAsAction="ifRoom"
          android:actionProviderClass="android.widget.ShareActionProvider" />
    ...
</menu>

 

2. 设置默认的事件

private ShareActionProvider mShareActionProvider;
@Override
public boolean onCreateOptionsMenu(Menu menu){
    mShareActionProvider
= (ShareActionProvider) menu.findItem(R.id.menu_share).getActionProvider();

   
// Set the default share intent

       Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
        shareIntent.setType("text/plain");
    mShareActionProvider
.setShareIntent(shareIntent);

   
return true;
}

 

 

 

Action Bar是什么?

很长一段时间内,开发人员一直在为他们的Android应用程序设计功能标题栏,Android 3.0正式引入了Action Bar部件,规范了应用程序导航设计,一些新的Android设备,如平板电脑也抛弃了传统的导航功能,使用软件按钮取代了物理主屏、菜单、后退和搜索按钮。

Action Bar的概念非常简单,如果你的应用程序有一个“选项”菜单,当用户点击“菜单”按钮时,出现一个活动项目菜单,你的应用程序可以利用Android 3.0中的Action Bar功能,它修改了应用程序标题栏,以一种易于使用的方式显示那些先前在“选项”菜单中的活动,如图1所示。

Action Bar是什么?
图 1 蜂巢设备上的Action Bar

Action Bar有哪些行为?

最棘手的是运行蜂巢及更高版本的设备显示不同Action Bar功能时,取决于应用程序的目标SDK是设置为蜂巢还是传统的API级别。

我们来看一个简单的例子,假设我们的应用程序包含四个屏幕:一个主Activity和三个“清洁的”Activity(打扫、擦洗和吸尘),我们向主Activity添加一个选项菜单,以便让用户跳转到另三个Activity,如图2所示。

Action Bar有哪些行为?
图 2 带有一个选项菜单和四个屏幕的简单应用程序

该应用程序两个基本的组件是选项菜单资源文件和主Activity类,其它Activity类只是简单地显示一个ImageView和一个TextView控件,选项菜单资源文件简单定义了选项菜单项,其内容如下:

  
  
  
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <menu 
  3.     xmlns:android=">http://schemas.android.com/apk/res/android"> 
  4.     <item 
  5.         android:id="@+id/sweep" 
  6.         android:icon="@drawable/ic_menu_sweep" 
  7.         android:title="@string/sweep"  
  8.         android:onClick="onOptionSweep" /> 
  9.     <item 
  10.         android:id="@+id/scrub" 
  11.         android:icon="@drawable/ic_menu_scrub" 
  12.         android:title="@string/scrub" 
  13.         android:onClick="onOptionScrub" /> 
  14.     <item 
  15.         android:id="@+id/vacuum" 
  16.         android:icon="@drawable/ic_menu_vac" 
  17.         android:title="@string/vacuum"  
  18.         android:onClick="onOptionVacuum" /> 
  19. </menu> 

主Activity类将这个菜单资源作为一个选项菜单载入,并定义了每个选项菜单项的onClick处理程序,其内容如下:

  
  
  
  
  1. package com.mamlambo.actonthis; 
  2. import android.app.Activity; 
  3. import android.content.Intent; 
  4. import android.os.Bundle; 
  5. import android.view.Menu; 
  6. import android.view.MenuInflater; 
  7. import android.view.MenuItem; 
  8. public class ActOnThisActivity extends Activity { 
  9.    /** Called when the activity is first created. */ 
  10.    @Override 
  11.    public void onCreate(Bundle savedInstanceState) { 
  12.       super.onCreate(savedInstanceState); 
  13.       setContentView(R.layout.main); 
  14.    } 
  15.    @Override 
  16.    public boolean onCreateOptionsMenu(Menu menu) { 
  17.       MenuInflater inflater = getMenuInflater(); 
  18.       inflater.inflate(R.menu.cleaningoptions, menu); 
  19.       return true; 
  20.    } 
  21.       public void onOptionSweep(MenuItem i) 
  22.    { 
  23.       startActivity(new Intent(this, SweepActivity.class)); 
  24.    } 
  25.    public void onOptionScrub(MenuItem i) 
  26.    { 
  27.       startActivity(new Intent(this, ScrubActivity.class)); 
  28.    } 
  29.       public void onOptionVacuum(MenuItem i) 
  30.    { 
  31.       startActivity(new Intent(this, VacuumActivity.class)); 
  32.    } 
  33.    } 

到现在为止我们没有做任何事情,因此我们在技术上并不需要将应用程序的Android清单文件设置为高目标API级别,我们这里将其设置为API级别9。

  
  
  
  
  1. <uses-sdk android:minSdkVersion="9" /> 

当我们在蜂巢设备上运行这个“传统的”应用程序时,系统栏会显示一个像网格的图标(第四个),它和传统Android手机上的“菜单”按钮所起的作用是等同的,只不过它变成一个软件按钮了,点击它将会显示选项菜单,就好像是在一部老式智能手机上一样,如图3所示,屏幕顶部的标题栏仅仅显示了应用程序的标题。

Action Bar有哪些行为?
图 3 在蜂巢设备上的传统应用程序行为

如果我们修改应用程序Android清单文件的目标API级别,将其设为API级别11(蜂巢),应用程序将自动应用Action Bar机制。

  
  
  
  
  1. <uses-sdk android:minSdkVersion="11" /> 

默认情况下,标题栏显示了应用程序图标,名称和所谓的溢出菜单图标,点击这个图标会弹出一个文本菜单,列出选项菜单项,如图4所示。

Action Bar有哪些行为?
图 4 蜂巢设备上的蜂巢应用程序行为

自定义你的Action Bar

当你的应用程序目标设为蜂巢平台时,你可以利用Action Bar部件提供的全部功能,将你的选项菜单项放在Action Bar的右上角,对用户来说使用更方便,控制该行为的主菜单项属性是android:showAsAction。

这个属性可接受的值有:

1、always:这个值会使菜单项一直显示在Action Bar上。

2、ifRoom:如果有足够的空间,这个值会使菜单项显示在Action Bar上。

3、never:这个值使菜单项永远都不出现在Action Bar上。

4、withText:这个值使菜单项和它的图标,菜单文本一起显示。

我们修改选项菜单资源文件来看看这个属性的不同使用效果,首先,如果你还记得图1的内容,不记得就返回到前面重新观察一下,你就会发现,Action Bar中显示了每个菜单项的图标和它们的名称,换句话说就是,每个菜单项目有以下属性:

  
  
  
  
  1. android:showAsAction="ifRoom|withText" 

另一个合理的设置是显示Action Bar上的每个菜单项,只要有空间,但没有杂乱的文字,换句话说就是,每个菜单项有以下属性:

  
  
  
  
  1. android:showAsAction="ifRoom" 

图5显示了这个变化在典型蜂巢设备上的效果。

自定义你的Action Bar
图 5 当空间足够时,在Action Bar上显示菜单项,包括文本

最后,如果我们不想让Vacuum菜单项显示在Action Bar上,其属性值就应该是:

  
  
  
  
  1. android:showAsAction="never" 

这样在Action Bar上将只会显示两个菜单项:Sweep和Scrub。在右上角,你会再次看到溢出菜单,点击它就会看到被设为“never”的菜单项,如Vacuum,以及其它不适合放在Action Bar上的菜单项,如图6所示。

自定义你的Action Bar
图 6 在Action Bar上显示部分菜单项,其它菜单项永远不显示(显示在溢出菜单中)

  
  
  
  
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <menu 
  3.     xmlns:android="http://schemas.android.com/apk/res/android"> 
  4.     <item 
  5.         android:id="@+id/sweep" 
  6.         android:icon="@drawable/ic_menu_sweep" 
  7.         android:title="@string/sweep"  
  8.         android:onClick="onOptionSweep" /> 
  9.     <item 
  10.         android:id="@+id/scrub" 
  11.         android:icon="@drawable/ic_menu_scrub" 
  12.         android:title="@string/scrub" 
  13.         android:onClick="onOptionScrub" /> 
  14.     <item 
  15.         android:id="@+id/vacuum" 
  16.         android:icon="@drawable/ic_menu_vac" 
  17.         android:title="@string/vacuum"  
  18.         android:onClick="onOptionVacuum" /> 
  19. </menu> 

处理Action Bar上的应用程序图标点击行为

Action Bar的另一个功能是用户可以点击左上角的应用程序图标,虽然默认情况下点击行为没有任何反应,但如果增加一个自定义“主屏幕”功能,或关联到你的启动屏幕,那样操作起来更有趣。

假设你想更新ScrubActivity类中的默认Action Bar,以便点击应用程序图标时用户可以返回到主Activity(同时清空Activity stack)。

实现起来也很简单,你只需要为ScrubActivity类实现onOptionsItemSelected()方法,并处理特定的菜单项标识符android.R.id.home即可,例如:

  
  
  
  
  1. @Override 
  2. public boolean onOptionsItemSelected(MenuItem item)  
  3. {     
  4.    switch (item.getItemId())  
  5.    {         
  6.       case android.R.id.home:             
  7.          Intent intent = new Intent(this, ActOnThisActivity.class);             
  8.          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
  9.          startActivity(intent);             
  10.          return true;         
  11.       default:             
  12.          return super.onOptionsItemSelected(item);     
  13.    } 

就这么简单,你也可以在应用程序图标的左边显示一个箭头,在你Activity的onCreate()方法中联合使用setDisplayHomeAsUpEnabled()方法,可以返回到指定的屏幕。

  
  
  
  
  1. ActionBar bar = getActionBar(); 
  2. bar.setDisplayHomeAsUpEnabled(true); 

如图7所示,我们在Sweep屏幕上启用了这个功能,在Action Bar上增加了一个箭头小图标。

处理Action Bar应用程序图标点击行为
图 7 带有可点击的主屏幕按钮和一个返回箭头的Action Bar

使用不需要Action Bar的屏幕

当你将应用程序目标设为API 11或更高时,你的所有屏幕默认都将拥有Action Bar,如果你不想用这个新部件,有几种方法可以移除它,最简单的方法可能是通过编程手段直接在Activity类中关闭它,例如,我们可以用下面两行代码关闭Vacuum屏幕上的Action Bar,只需要将这两行代码添加到Activity类的onCreate()方法中即可。

  
  
  
  
  1. ActionBar bar = getActionBar(); 
  2. bar.hide(); 

这两行代码将移除屏幕顶部的整个Action Bar,应用程序名称也不会显示了,你也可以隐藏Action Bar,在布局文件中创建一个特殊的自定义主题即可,详细情况请阅读Android SDK文档。

Action Bar的高级功能

本文只是对Action Bar做了简单的介绍,可以说只触及了它的表面,Action Bar是支持样式的,包括修改背景图像和其它自定义属性,它们也支持多个其它成熟的视图类型和部件,不仅仅是那些在选项菜单中的菜单项,如标签和下来列表,你甚至可以增加其它类型的视图控件,创建Action Bar功能区域,详细情况请阅读Android SDK文档。

小结

如果你的应用程序已经使用了选项菜单,当你把目标设为蜂巢设备时,你可以利用Action Bar的所有功能,就像向你的菜单布局文件增加一些新属性一样简单。每个屏幕的Action Bar都是可定制的,作为开发人员,你可以控制显示哪个项目,以及如何显示,当你想留更多的屏幕显示游戏画面等内容时,你甚至可以移除整个Action Bar。

 


你可能感兴趣的:(android,action,menu,encoding)