Xamarin.Android の ActionBar
TabActivity
を使用する場合、タブ アイコンを作成するコードは、Android 4.0 フレームワークに対して実行しても効果がありません。 機能的には、2.3 より前のバージョンの Android と同様に機能しますが、TabActivity
クラス自体は 4.0 で非推奨になりました。 タブ付きインターフェイスを作成するには操作バーを使用する新しい方法が導入されており、ここからはこれについて説明します。
操作バー タブ
操作バーには、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
イベントを処理する必要があります。 このハンドラーでは、タブのコンテンツを作成できます。操作バー タブは、Activity 内のユーザー インターフェイスの一部を表すクラスである Fragment と合わせて機能するように設計されています。 この例では、Fragment のビューには 1 つの 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>
メニューの拡張
メニューを拡張するには、Activity サブクラスで OnCreateOptionsMenu
をオーバーライドします。 メニューへの参照を取得したら、以下に示すように、メニュー項目の 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
メソッドに渡されたインテントを使用して、適切な Activity を起動します。 このケースでは、次のコードを使用して画像を送信するインテントを作成します。
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 の作成時にパブリックにアクセスできる場所にコピーされるため、メッセージング アプリなどの他のアプリケーションがアクセスできるようになります。 この記事に付属するサンプル コードには、その使用方法を示すこの例の完全なソースが含まれています。