Xamarin.Android の ActionBar

TabActivity を使用する場合、タブ アイコンを作成するコードは、Android 4.0 フレームワークに対して実行しても効果がありません。 機能的には、2.3 より前のバージョンの Android と同様に機能しますが、TabActivity クラス自体は 4.0 で非推奨になりました。 タブ付きインターフェイスを作成するには操作バーを使用する新しい方法が導入されており、ここからはこれについて説明します。

操作バー タブ

操作バーには、Android 4.0 でタブ付きインターフェイスを追加するためのサポートが含まれています。 次のスクリーンショットは、このようなインターフェイスの例を示しています。

エミュレーターで実行されているアプリのスクリーンショット。2 つのタブが表示されています

操作バーでタブを作成するには、まず、タブをサポートするように 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 の作成時にパブリックにアクセスできる場所にコピーされるため、メッセージング アプリなどの他のアプリケーションがアクセスできるようになります。 この記事に付属するサンプル コードには、その使用方法を示すこの例の完全なソースが含まれています。