ActionBar for Xamarin.Android

当使用 TabActivity 时,用于创建选项卡图标的代码在针对 Android 4.0 框架运行时没有效果。 虽然在功能上它与 2.3 之前的 Android 版本一样,但 TabActivity 类本身在 4.0 中已被弃用。 引入了一种使用操作栏创建选项卡界面的新方法,接下来我们将讨论这种方法。

操作栏选项卡

操作栏支持在 Android 4.0 中添加选项卡界面。 以下屏幕截图显示了此类界面的示例。

在模拟器中运行的应用的屏幕截图;显示两个选项卡

若要在操作栏中创建选项卡,首先需要将其 NavigationMode 属性设置为支持选项卡。 在 Android 4 中,Activity 类上提供了 ActionBar 属性,可用于设置 NavigationMode,如下所示:

this.ActionBar.NavigationMode = ActionBarNavigationMode.Tabs;

完成上述操作后,可以通过调用操作栏上的 NewTab 方法来创建选项卡。 对于此选项卡实例,可以调用 SetTextSetIcon 方法来设置选项卡的标签文本和图标;这些调用在下面的代码中按顺序进行:

var tab = this.ActionBar.NewTab ();
tab.SetText (tabText);
tab.SetIcon (Resource.Drawable.ic_tab_white);

但是,我们需要先处理 TabSelected 事件,才能添加选项卡。 在此处理程序中,可以为选项卡创建内容。操作栏选项卡旨在处理片段,这些片段是表示活动中用户界面部分的类。 在此示例中,片段的视图包含一个 TextView,我们在 Fragment 子类中对其进行扩充,如下所示:

class SampleTabFragment: Fragment
{           
    public override View OnCreateView (LayoutInflater inflater,
        ViewGroup container, Bundle savedInstanceState)
    {
        base.OnCreateView (inflater, container, savedInstanceState);

        var view = inflater.Inflate (
            Resource.Layout.Tab, container, false);

        var sampleTextView =
            view.FindViewById<TextView> (Resource.Id.sampleTextView);            
        sampleTextView.Text = "sample fragment text";

        return view;
    }
}

TabSelected 事件中传递的事件参数是 TabEventArgs 类型,其中包括一个 FragmentTransaction 属性,我们可以使用它来添加片段,如下所示:

tab.TabSelected += delegate(object sender, ActionBar.TabEventArgs e) {             
    e.FragmentTransaction.Add (Resource.Id.fragmentContainer,
        new SampleTabFragment ());
};

最后,可以通过调用 AddTab 方法将选项卡添加到操作栏,如以下代码所示:

this.ActionBar.AddTab (tab);

有关完整示例,请参见本文档示例代码中的 HelloTabsICS 项目

ShareActionProvider

ShareActionProvider 类支持从操作栏执行共享操作。 它负责创建一个操作视图,其中包含可以处理共享意图的应用列表,并保留先前使用过的应用程序的历史记录,以便以后能从操作栏轻松访问它们。 这样,应用程序就可以通过在整个 Android 系统中保持一致的用户体验来共享数据。

图像共享示例

例如,下面是操作栏的屏幕截图,其中包含用于共享图像的菜单项。 当用户点击操作栏上的菜单项时,ShareActionProvider 会加载应用程序以处理与 ShareActionProvider 关联的意图。 在此示例中,之前使用过消息应用程序,因此它显示在操作栏上。

操作栏中消息应用程序图标的屏幕截图

当用户单击操作栏中的项时,包含共享图像的消息应用会启动,如下所示:

显示猴子图像的消息应用的屏幕截图

指定操作提供程序类

若要使用 ShareActionProvider,请在操作栏菜单的 XML 中的菜单项上设置 android:actionProviderClass 属性,如下所示:

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

扩充菜单

为了扩充菜单,我们在 Activity 子类中替代 OnCreateOptionsMenu。 获得菜单引用后,可以从菜单项的 ActionProvider 属性中获取 ShareActionProvider,然后使用 SetShareIntent 方法设置 ShareActionProvider 的意图,如下所示:

public override bool OnCreateOptionsMenu (IMenu menu)
{
    MenuInflater.Inflate (Resource.Menu.ActionBarMenu, menu);       

    var shareMenuItem = menu.FindItem (Resource.Id.shareMenuItem);           
    var shareActionProvider =
       (ShareActionProvider)shareMenuItem.ActionProvider;
    shareActionProvider.SetShareIntent (CreateIntent ());
}

创建意向

ShareActionProvider 将使用传递给上述代码中 SetShareIntent 方法的意图来启动相应的活动。 在本例中,我们将使用以下代码创建用于发送图像的意图:

Intent CreateIntent ()
{  
    var sendPictureIntent = new Intent (Intent.ActionSend);
    sendPictureIntent.SetType ("image/*");
    var uri = Android.Net.Uri.FromFile (GetFileStreamPath ("monkey.png"));          
    sendPictureIntent.PutExtra (Intent.ExtraStream, uri);
    return sendPictureIntent;
}

上述代码示例中的图像作为资产包含在应用程序中,并在创建活动时复制到可公开访问的位置,因此其他应用程序(如消息应用)也可以访问该图像。 本文附带的示例代码包含该示例的完整源代码,说明了其使用方法。