Tips

ContextMenuInfoオブジェクトを用いて動的にコンテキストメニューの中身を変えるサンプルアプリ

OptionMenuを表示させるAndroidサンプルアプリです!

※はじめに
この記事はAndroidアプリの開発が、初心者であるという方のための記事です。
そのため、なるべく複雑な説明は避け、コピー&ペイストですぐに動くものをご紹介します。
JavaやAndroidを理解されている方で細かい説明が必要な方は、当ブログ内の連載記事である「Android Tips」をご覧ください。

このアプリはCheckBoxの状態に応じて、onPrepareOptionsMenu()を用いて、表示されるオプショントメニューを切り替えるというものです。

アプリ完成図

1

2

3

MainActivity.java

package com.example.contextmenu2;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private String[] item = { "java", "Network", "Linux" };
    private String[] java = { "OCJ-P Bronze", "OCJ-P Silver", "OCJ-P Gold" };
    private String[] network = { "CCNA", "CCNP", "CCIE" };
    private String[] linux = { "LPIC 1", "LPIC 2", "LPIC 3" };
    ListView listView;

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

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, item);

        listView = (ListView) findViewById(R.id.listView1);
        listView.setAdapter(adapter);

        // コンテキストメニューのタッチ対象ウィジェットをregisterForContextMenu()を用いて指定
        registerForContextMenu(listView);
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
            ContextMenuInfo menuInfo) {

        // 第3引数のmenuInfoを使用します。
        // ContextMenuInfoオブジェクトは長押したウィジェットがListViewなどのリストの場合に使用します。
        AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) menuInfo;
        menu.setHeaderTitle((String) listView
                .getItemAtPosition(adapterInfo.position));

        long listId = adapterInfo.id;
        String arrayId = String.valueOf(listId);

        if (arrayId.equals("0")) {
            menu.add(0, 0, 0, java[0]);
            menu.add(0, 10, 1, java[1]);
            menu.add(0, 20, 2, java[2]);

        } else if (arrayId.equals("1")) {
            menu.add(1, 0, 0, network[0]);
            menu.add(1, 10, 1, network[1]);
            menu.add(1, 20, 2, network[2]);

        } else if (arrayId.equals("2")) {
            menu.add(2, 0, 0, linux[0]);
            menu.add(2, 10, 1, linux[1]);
            menu.add(2, 20, 2, linux[2]);

        }
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterContextMenuInfo adapterInfo = (AdapterContextMenuInfo) item
                .getMenuInfo();

        long id = adapterInfo.id;
        String str = String.valueOf(id);

        if (str.equals("0")) {
            if (item.getItemId() == 0) {
                Toast.makeText(this, java[0], Toast.LENGTH_SHORT).show();
            } else if (item.getItemId() == 10) {
                Toast.makeText(this, java[1], Toast.LENGTH_SHORT).show();
            } else if (item.getItemId() == 20) {
                Toast.makeText(this, java[2], Toast.LENGTH_SHORT).show();
            }

        } else if (str.equals("1")) {
            if (item.getItemId() == 0) {
                Toast.makeText(this, network[0], Toast.LENGTH_SHORT).show();
            } else if (item.getItemId() == 10) {
                Toast.makeText(this, network[1], Toast.LENGTH_SHORT).show();
            } else if (item.getItemId() == 20) {
                Toast.makeText(this, network[2], Toast.LENGTH_SHORT).show();
            }

        } else if (str.equals("2")) {
            if (item.getItemId() == 0) {
                Toast.makeText(this, linux[0], Toast.LENGTH_SHORT).show();
            } else if (item.getItemId() == 10) {
                Toast.makeText(this, linux[1], Toast.LENGTH_SHORT).show();
            } else if (item.getItemId() == 20) {
                Toast.makeText(this, linux[2], Toast.LENGTH_SHORT).show();
            }

        }

        return super.onContextItemSelected(item);
    }

}
[divider]

activity_main.xml

今回の画面の定義(activity_main.xml)はデフォルトのtextviewにidのみ追加しています。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="15dp"
    tools:context=".MainActivity" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </ListView>

</RelativeLayout>

これでOKです。

Androidアプリ開発の必須知識!JAVAプログラミングを学べる連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search