SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin.Android ActionBar(その1 オプションメニュー)

【 Xamarin 記事一覧 】

ActionBarは、Android 3.0(API Level 11)以上で使用可能であり、2.x以前のタイトルバー及び従来メニューの後継です。

1 タイトル


ActionBarのSetメソッドで、タイトル(サブタイトル)の指定が可能です。

ActionBar.SetTitle(Resource.String.ActionbarTitle); //タイトルの指定 
ActionBar.SetSubtitle(Resource.String.ActionbarSubTitle); //サブタイトルの指定
ActionBar.SetDisplayShowTitleEnabled(true); //タイトル・サブタイトルの表示・非表示

2 Homeボタン

SetHomeButtonEnabled()にtrueを設定すると、アプリアイコンのタッチ時にid=HomeでOnMenuItemSelected()が呼ばれます。

ActionBar.SetHomeButtonEnabled(true);
public override bool OnMenuItemSelected(int featureId, IMenuItem item){
    if (item.ItemId == Android.Resource.Id.Home) {
       Toast.MakeText(this, "Home", ToastLength.Short).Show();
    }
}

動作は同じですが、SetHomeButtonEnabled()の代わりにSetDisplayHomeAsUpEnabled()を使用すると、アプリアイコンの左に戻るアイコンが追加されます。

SetDisplayHomeAsUpEnabled(true);

アプリアイコンへのタッチでは、通常1階層上位への復帰が実装されているため、それに従うのが推奨されています。

3 オプションメニュー

オプションメニューは。item要素の「android:showAsAction」を追加することで、アクションバー上にメニューが展開されます。
(※API Level 11以前では、showAsActionリソースがありません)

android:showAsActionの指定は、下記のとおりです。

never : 常に表示しない
ifRoom : 表示する余裕があれば表示
always : 常に表示
withText : titleテキストを表示
collapseActionView : android:actionViewLayoutのアクションビューと関連付ける

通常「"ifRoom|withText"」が使用され、アイコンだけで説明不要な場合にwithTextが省略されます。
alwaysはスペースがなくても強制表示されるので注意が必要です

図は、次のActionBar.xmlをオプションメニューとして指定した場合の縦の場合と横の場合の表示のようすです。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/optionMenu1"
        android:showAsAction="ifRoom|withText"
        android:icon="@android:drawable/ic_menu_save"
        android:title="SAVE" />
  <item android:id="@+id/optionMenu2"
        android:icon="@android:drawable/ic_menu_edit"
        android:showAsAction="ifRoom|withText"
        android:title="EDIT" />
  <item android:id="@+id/optionMenu3"
        android:icon="@android:drawable/ic_menu_gallery"
        android:showAsAction="ifRoom|withText"
        android:title="GALLERY" />
  <item android:id="@+id/optionMenu4"
        android:icon="@android:drawable/ic_menu_delete"
        android:showAsAction="ifRoom|withText"
        android:title="DELETE" />
  <item android:id="@+id/optionMenu5"
        android:icon="@android:drawable/ic_menu_manage"
        android:showAsAction="ifRoom|withText"
        android:title="MANAGE" />
  <item android:id="@+id/optionMenu6"
        android:icon="@android:drawable/ic_menu_call"
        android:showAsAction="ifRoom|withText"
        android:title="CALL" />
</menu>


4 分割


UiOptionsにSplitActionBarWhenNarrowを指定すると、縦画面の時だけ、ActionBarが上下に分割されます。
(横画面には関係ありません)

[Activity(Label = "AndroidApplication1", MainLauncher = true, Icon = "@drawable/icon",
        UiOptions=Android.Content.PM.UiOptions.SplitActionBarWhenNarrow)]
    public class MainActivity : Activity {

自動追加されたマニュフェストは、次のようになっています。

<application android:label="AndroidApplication1" android:icon="@drawable/icon" android:name="mono.android.app.Application" android:debuggable="true">
    <activity android:icon="@drawable/icon" android:label="AndroidApplication1" android:uiOptions="splitActionBarWhenNarrow" android:name="androidapplication1.MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

【 Xamarin 記事一覧 】