博客分类: 官方教程
返回索引目录
原文链接: ActionBar
译文链接: Xamarin.Android用户界面——操作栏
当使用TabActivity时,在Android 4.0框架上创建选项卡图标的代码是没有效果的。尽管它可以在Android 2.3及之前的版本中有效的工作,但在4.0中,TabActivity类已经被弃用了。因为有一种新的方法来创建选择卡式界面 —— 利用操作栏,我们将在下面讨论它。
在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事件。在此处理程序中,我们可以为选项卡创建内容。操作栏选项卡是与Fragments一起使用的 —— Fragments是用于表示在Activity中用户界面的一部分的类。例如,例如我们要在Fragment视图中包含一个单独的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属性 —— 我们可以通过它添加fragment,如下所示:
tab.TabSelected += delegate(object sender, ActionBar.TabEventArgs e) { e.FragmentTransaction.Add (Resource.Id.fragmentContainer, new SampleTabFragment ()); };
最后,我们可以通过调用AddTab方法来将选项卡添加 到操作栏中,如下所示:
this.ActionBar.AddTab (tab);
关于完整的示例,参阅HelloTabsICS项目: Hello Tabs ICS 。
ShareActionProvider类允许在操作栏中进行共享操作。它负责创建一个含有应用列表的操作视图来处理一个共享的Intent,以及保留之前使用应用的历史,并以此让操作栏稍后可以方便的访问它们。这样让应用可以在Android中使用前后一致的用户体验来共享数据。
例如,下面是一个含有共享图像菜单项的操作栏示例图。当用户点击操作栏重点菜单项时,ShareActionProvider加载应用 来处理与ShareActionProvider相关联的Intent。在此示例中,由于messaging应用在之前已经使用过,所以在操作栏中会显示它:
当用户点击操作栏中的项目时,包含共享图片的messaging应用会启动,如下图所示:
要使用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的Intent,如下所示:
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中将会使用到 Intent,然后将其传递给SetShareIntent方法(如上面代码所示),以此来启动对应的Activity。在本示例中,我们创建 Intent后,为其传递一个图片,如下面代码所示:
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; }
在上述代码示例中,图片是 作为资源包含到应用程序中的,并且在Activity创建的时候,将其复制到可以公开访问的位置,因此它可以被其他应用访问,如messaging应用。本文附带的示例代码包含此示例的完整代码,以此说明用法。
译: 奇葩史