世界を目指せ!Androidアプリ開発入門

第6回 ユーザインターフェースの使い方:その1

この記事を読むのに必要な時間:およそ 3.5 分

メニューの追加とハンドリング

次に,メニューを作成します。

[ファイル]メニューの[新規]⁠-⁠その他]を選択します。

[新規]ダイアログが表示されたら[Android]から[Android XML File]を選択して,⁠次へ]をクリックします。

メニューの作成

画像

まず,リソースファイルの名前を指定します。

まずは,主画面用のメニューリソースをするので,名前は「mainmenu.xml」とします。⁠副画面の場合は「submenu.xml」等とします)ファイル名は,小文字で表記をしないとエラーになるので,注意して下さい。次に[What type of resource would you like to create?]から[Menu]を選択して[終了]をクリックします。

すると,メニューエディタが表示されます。

メニューが表示される。

画像

この状態では,メニューが空なので[Add...]をクリックし,ダイアログの[item]を選択して,メニューのアイテムを追加します。メニューアイテムを追加すると,アイテム属性の設定画面が一覧の右側に表示されます。

アイテム属性の設定画面の一覧が表示される。

画像

まずは,メニュータイトルの設定を行います。

編集エリアに,直接タイトル文字列を入力することもできますが,アプリのタイトルと同様に文字列リソースとして管理します。たとえば,⁠副画面へ移動」のようなメニュータイトルで文字列リソースをします。

作成後は,⁠Title][Browse...]をクリックして,ダイアログの一覧から作成したリソースIDを選択します。

次に,メニューIDを設定します。⁠id]「@+id/」の後に「menu_goto」と入力します。文字列リソースのID名を付ける際にご説明しましたが,メニューIDだと区別し易くするためにIDの最初にmenu_を付けます。

メニューIDの設定を行う。

画像

副画面のメニューも同様の手順で作成してください。

メニューリソースの準備ができたら,メニューを画面に表示する以下のソースコードを追加します。

SkeletonActivity.javaのonCreateOptionsMenuには,コードが存在していますが,これはプログラムの中からメニューを作成しています。今回は,リソースからメニューを読み込んで作成するので,既存のコードを削除して,新しい内容で置き換えます。これは,主画面の「SkeletonActivity.java」と副画面の「SkeletonSubActivity.java」に追加します。

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    super.onCreateOptionsMenu( menu );

    MenuInflater inflater = getMenuInflater();

    inflater.inflate( R.menu.mainmenu, menu );
    return true;
}

onCreateOptionsMenuは,画面にメニューが表示される直前に呼び出されます。

getMenuInflaterは,アクティビティのコンテキストに対するMenuInflaterを返します。

inflater.inflateの第一引数に,メニューリソースのID,第二引数にonCreateOptionsMenuの第一引数で与えられたmenuを指定します。

次に,メニューアイテムが選択された場合のコードを追加します。以下は,主画面用のコードです。

public boolean onOptionsItemSelected(MenuItem item)
{
	switch ( item.getItemId() )
	{
		case R.id.menu_goto:
		{
		Intent intent = new Intent( SkeletonActivity.this, SkeletonSubActivity.class );
			startActivity( intent );
			return true;
		}
	}
	return super.onOptionsItemSelected(item);
}

onOptionsItemsSelectedは,メニューアイテムが選択されると呼び出されます。

item.getItemsId()で,選択されたメニューアイテムのIDを判断できるので,switch~caseで判断を行い,menu_gotoだったら,画面切り替えのコードが実行します。

副画面用のコードは以下になります。

Intentの第二引数に,主画面のクラス「SkeletonActivity.class」を指定しているところに注目してください。

public boolean onOptionsItemSelected(MenuItem item)
{
	switch ( item.getItemId() )
	{
		case R.id.menu_goto:
		{
			Intent intent = new Intent( this, SkeletonActivity.class );
			startActivity( intent );
			return true;
		}
	}
	return super.onOptionsItemSelected(item);
}

著者プロフィール

傍島康雄(そばじまやすお)

5月30日生まれ。

モバイルデバイスが大好物。それで動くアプリの開発に喜びを感じている。スマートフォン前夜のWindows Mobile,PalmOSのアプリに情熱を傾けていたが,最近は停滞気味でコードを書くよりも文章を書く機会が多くなっており,文章を書くのも,プログラミングと同じくらい奥深い作業だと感じている。

ブログ:http://yasuos.com/blog/

コメント

  • Re:

    #2さんのコメント助かりました。
    ありがとうございます。

    Commented : #8  onPrepareOptionsMenu (2012/04/19, 15:42)

  • 直りました

    SkeletonActivity.java に onOptionsItemSelected を実装した時点で #6 の事象が起きていたのですが、SkeletonSubActivity.java にも実装したところ、エラーはなくなりました。

    R.java にも menu_goto の id クラスが追加されました。

    Commented : #7  #6です (2012/03/26, 10:56)

  • R.javaにidが反映されません

    mainmenu.xml、submenu.xml に、それぞれ
    @+id/menu_goto
    を定義したのですが、
    R.javaの id クラスになぜかそれらが反映されません。

    それにより、ソース中の
    「case R.id.menu_goto:」の箇所で
    怒られます。

    なお、コンソール上に
    W/ResourceType( 1124): Bad XML block: header size 85 or total size 0 is larger than data size 0
    W/ResourceType( 1124): Bad XML block: header size 85 or total size 0 is larger than data size 0
    C:\eclipse\workspace\SkeletonApp\res\menu\mainmenu.xml:3: エラー: エラー: No resource found that matches the given name (at 'title' with value '@string/menu_gotosub').
    C:\eclipse\workspace\SkeletonApp\res\menu\submenu.xml:3: エラー: エラー: No resource found that matches the given name (at 'title' with value '@string/menu_gotosub').
    が表示されています。

    解消方法についてご教授お願いします。m(_ _)m

    Commented : #6  超初心者 (2012/03/23, 17:16)

  • 分かりませんでした

    #1#2さんのコメントを見るまで、何がなんだか分かりませんでした。
    書いてある通りにやっても動かないので、だめもとで、環境の再インストールを2回もしてしまいました。
    本文の修正は手間がかかるのかもしれませんが、下のコメントを参照して下さい程度は書いておいてほしいです。

    Commented : #5  初心者 (2011/10/31, 17:47)

  • 同感

    このサイトをとても参考にさせて頂いています。
    しかし、ソース内に前回とのつながりが一部なくなっているのが残念でした。
    下記コメントの「NULL避け」「menuについても」

    前回から難易度が上がった為このコメント欄を見るまで時間がかかってしまいました。

    今後のアプリ制作初心者の方の為にも訂正をお願い致します!!

    Commented : #4  アプリ制作初心者 (2011/07/25, 01:05)

1ページ(1/2)    

コメントの記入