转载

[译]:Xamarin.Android用户界面——操作栏

博客分类: 官方教程

返回索引目录

原文链接: ActionBar

译文链接: Xamarin.Android用户界面——操作栏

ActionBar

当使用TabActivity时,在Android 4.0框架上创建选项卡图标的代码是没有效果的。尽管它可以在Android 2.3及之前的版本中有效的工作,但在4.0中,TabActivity类已经被弃用了。因为有一种新的方法来创建选择卡式界面 —— 利用操作栏,我们将在下面讨论它。

操作栏选项卡

在Android 4.0中,操作栏引入了对添加标签界面的支持。下图展示了此类界面的示例:

[译]:Xamarin.Android用户界面——操作栏

要在操作栏中创建选项卡,我们首先需要设置它的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类

ShareActionProvider类允许在操作栏中进行共享操作。它负责创建一个含有应用列表的操作视图来处理一个共享的Intent,以及保留之前使用应用的历史,并以此让操作栏稍后可以方便的访问它们。这样让应用可以在Android中使用前后一致的用户体验来共享数据。

图片共享示例

例如,下面是一个含有共享图像菜单项的操作栏示例图。当用户点击操作栏重点菜单项时,ShareActionProvider加载应用 来处理与ShareActionProvider相关联的Intent。在此示例中,由于messaging应用在之前已经使用过,所以在操作栏中会显示它:

[译]:Xamarin.Android用户界面——操作栏

当用户点击操作栏中的项目时,包含共享图片的messaging应用会启动,如下图所示:

[译]:Xamarin.Android用户界面——操作栏

指定操作提供程序类

要使用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 ());
}

创建Intent

在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应用。本文附带的示例代码包含此示例的完整代码,以此说明用法。

示例

  • 官方示例——Hello Tabs ICS

译: 奇葩史

原文  http://www.shisujie.com/blog/ActionBar
正文到此结束
Loading...