2011年7月31日日曜日

Androidアプリ入門~メニュー編~だじぇ

Androidアプリのメニューには大きく分けて「オプションメニュー」「コンテキストメニュー」「サブメニュー」の3つがあるそうです。

オプションメニューは、メニューボタンを押すと大体のアプリで画面下部に出てくるボタンです。

次にコンテキストメニュー。Androidのスマートフォン初心者の私はまず「コンテキストメニュー?PCのあれっぽいやつ?そんなのあったの?」って思いました。特定のビューを長めにタップすればいいんだそうです。ちょっとスマフォレベルが上がりました。

最後にサブメニュー。まあ、メニューの入れ子状態です。親・子の2世代まで可能っぽい。
一番右側の画像の状態。これはオプションメニューの親メニューを押しています。


メニューを作成するには、XMLファイルで定義してそれを読み込ませるか、コード内でガリガリ書くのどちらかになります。

XMLファイル
まあこんな感じです。
ファイルはres/xmlディレクトリに配置します(ディレクトリが無ければ作りましょう)。
これはオプションメニューのXMLファイルです。コンテキストメニューも同じように作ればおk。
checkableBehaviorを使うとチェック可能なUIにしてくれます。
コンテキストメニューの場合はステートレスなので、自分で状態管理が必要になります。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/user"
          android:icon="@drawable/user"
          android:title="@string/user" />
    <item android:id="@+id/group"
          android:icon="@drawable/group"
          android:title="@string/group" />
    <item android:id="@+id/parent2"
          android:title="親メニュー">
        <menu>
            <group android:checkableBehavior="single">
                <item android:id="@+id/red"
                      android:title="赤" />
                <item android:id="@+id/blue"
                      android:title="青" />
            </group>
        </menu>
    </item>
    <item android:id="@+id/mob1"
          android:title="モブ" />
    <item android:id="@+id/mob2"
          android:title="モブ" />
    <item android:id="@+id/mob3"
          android:title="モブ" />
    <item android:id="@+id/mob4"
          android:title="モブ" />
    <item android:id="@+id/mob5"
          android:title="モブ" />
</menu>

Javaコード

public class MenuSampleActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.menu_sample);

        // ボタンにコンテキストメニューを登録。
        // これで長めタップでコンテキストメニューを出せるようになる。
        Button button1 = (Button) this.findViewById(R.id.button1);
        registerForContextMenu(button1);
    }

    // オプションメニュー生成
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = this.getMenuInflater();
        inflater.inflate(R.menu.option_menu , menu);

        return true;
    }

    // オプションメニュー選択時の処理振り分け
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.user:
                debug("selected user menu");
                return true;
            case R.id.group:
                debug("selected group menu");
                return true;
            case R.id.red:
            case R.id.blue:
                item.setChecked(!item.isChecked());
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    // コンテキストメニュー生成
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {

        super.onCreateContextMenu(menu, v, menuInfo);
        MenuInflater inflater = getMenuInflater();

        switch(v.getId()) {
        case R.id.button1:
            inflater.inflate(R.menu.context_menu, menu);
            break;
        }

    }

    // コンテキストメニュー選択時の処理振り分け
    @Override
    public boolean onContextItemSelected(MenuItem item) {
        debug("call onContextItemSelected");
        switch (item.getItemId()) {
        case R.id.edit:
            return true;
        case R.id.delete:
            return true;
        default:
            return super.onContextItemSelected(item);
        }
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // Android2.3まではオプションメニューを開く度に、ここの処理が呼び出される。
        // Android3.0からはinvalidateOptionsMenuを明示的に呼ばないと、ここの処理は呼ばれない。
        debug("call onPrepareOptionsMenu");
        return super.onPrepareOptionsMenu(menu);
    }

    private void debug(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

}

ノシ

ニコニコ動画ランキング

 
無添加キャットフード通販専門店 ネコまんま