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
方法來建立索引標籤。 透過這個索引標籤實例,我們可以呼叫 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;
}
上述程式代碼範例中的影像隨附為具有應用程式的資產,並在建立活動時複製到可公開存取的位置,因此其他應用程式可以存取它,例如傳訊應用程式。 本文隨附的範例程式代碼包含此範例的完整來源,說明其用法。