使用 TabActivity時,針對 Android 4.0 架構執行時,建立索引標籤圖示的程式代碼沒有任何作用。 雖然它在功能上的運作方式與 2.3 之前的 Android 版本一樣運作,但類別 TabActivity 本身在 4.0 中已被取代。 已引進建立索引標籤式介面的新方法,其使用動作列,接下來我們將討論。
動作列索引標籤
動作列包含支援在 Android 4.0 中新增索引卷標式介面。 下列螢幕快照顯示這類介面的範例。
若要在動作列中建立索引標籤,我們必須先設定其 NavigationMode 屬性以支援索引標籤。 在Android 4中, 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 。 在此處理程式中,我們可以建立索引標籤的內容。動作列索引卷標的設計目的是使用 片段,這些片段是代表活動中使用者介面部分的類別。 在此範例中,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;
}
上述程式代碼範例中的影像隨附為具有應用程式的資產,並在建立活動時複製到可公開存取的位置,因此其他應用程式可以存取它,例如傳訊應用程式。 本文隨附的範例程式代碼包含此範例的完整來源,說明其用法。


