[Android]ポップアップメニューを表示する。 | 妄想プログラマのらくがき帳

2013年8月26日月曜日

[Android]ポップアップメニューを表示する。

ポップアップメニューは関連付けたViewのすぐ近くにポップアップ表示されるメニューです。その関連付けたView固有の操作を提供するのに使用します。

今回はListViewの項目を長押ししたときに項目別のポップアップメニューを表示してみます。
まず事前に項目ごとのメニューリソースを作成しておきます。

・listview_item1_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/listViewItem1Menu"
        android:title="Item1Menu"/>
</menu>

・listview_item2_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/listViewItem2Menu"
        android:title="Item2Menu"/>
</menu>

次にListViewのOnItemLongClickListenerにリスナを設定します。リスナはActivity.onCreate()の中などで設定します。
※ListViewのOnLongClickListenerでないことに注意。この違いに気付かず1時間ぐらいハマってました(´・ω・`)
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        // 長押しされた項目でMenuInflater.inflate()に指定するメニューリソースを切り替える
        PopupMenu popup = new PopupMenu(getApplicationContext(), view);
        MenuInflater inflater = popup.getMenuInflater();
        if (position == 0) {
            // 1番目の項目を長押しされたときはlistview_item1_menuのメニューを表示
            inflater.inflate(R.menu.listview_item1_menu, popup.getMenu());
        }
        else if (position == 1) {
            // 2番目の項目を長押しされたときはlistview_item2_menuのメニューを表示
            inflater.inflate(R.menu.listview_item2_menu, popup.getMenu());
        }
        popup.show();
        return true;
    }
}
PopupMenuクラスのコンストラクタには、ポップアップメニューを関連付けるViewを指定します。その後、PopupMenu.getMenuInflater()でMenuInflaterを取得、MenuInflater.inflate()にメニューリソースを指定してメニューを作成します。この流れは他のメニューと同じですね。

上記コードを実際に動作させたときのキャプチャがこちら。

1番目の項目を長押したときは1番目の項目すぐ下にlistview_item1_menuが表示され、2番目の項目を長押ししたときは2番目の項目のすぐ下にlistview_item2_menuが表示されました。

0 件のコメント:

コメントを投稿