博客分类: 官方教程
返回索引目录
原文链接: 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应用。本文附带的示例代码包含此示例的完整代码,以此说明用法。
译: 奇葩史