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
方法来创建选项卡。 对于此选项卡实例,可以调用 SetText
和 SetIcon
方法来设置选项卡的标签文本和图标;这些调用在下面的代码中按顺序进行:
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;
}
上述代码示例中的图像作为资产包含在应用程序中,并在创建活动时复制到可公开访问的位置,因此其他应用程序(如消息应用)也可以访问该图像。 本文附带的示例代码包含该示例的完整源代码,说明了其使用方法。