Xamarin.Android 的 ActionBar

使用 TabActivity時,針對 Android 4.0 架構執行時,建立索引標籤圖示的程式代碼沒有任何作用。 雖然它在功能上的運作方式與 2.3 之前的 Android 版本一樣運作,但類別 TabActivity 本身在 4.0 中已被取代。 已引進建立索引標籤式介面的新方法,其使用動作列,接下來我們將討論。

動作列索引標籤

動作列包含支援在 Android 4.0 中新增索引卷標式介面。 下列螢幕快照顯示這類介面的範例。

在模擬器中執行之應用程式的螢幕快照;顯示兩個索引標籤

若要在動作列中建立索引標籤,我們必須先設定其 NavigationMode 屬性以支援索引標籤。 在Android 4中, 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 。 在此處理程式中,我們可以建立索引標籤的內容。動作列索引卷標的設計目的是使用 片段,這些片段是代表活動中使用者介面部分的類別。 在此範例中,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 可用來新增片段的屬性,如下所示:

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>

擴充功能表

為了擴充功能表,我們會覆寫 OnCreateOptionsMenu Activity 子類別中的 。 一旦我們有功能表的參考,就可以從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,以啟動適當的活動。 在此情況下,我們會使用下列程式代碼建立意圖來傳送影像:

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;
}

上述程式代碼範例中的影像隨附為具有應用程式的資產,並在建立活動時複製到可公開存取的位置,因此其他應用程式可以存取它,例如傳訊應用程式。 本文隨附的範例程式代碼包含此範例的完整來源,說明其用法。