PopupMenuが消えるときに処理を行う


Android 3.0(Honeycomb)からメニュー項目がポップアップ状に表示されるPopupMenuが追加されました。

そのPopupMenuがAndroid4.0(ICS)で拡張されています。

3.0からの違い

  • inflateメソッドが追加され、Menu Resourceからコンテンツを生成することが可能になった
  • メニューが破棄された(消えた)ことを受け取るリスナーが追加された

PopupMenuの基本的な使い方は「PopupMenuを使う」を参照してください。

それでは続きでICSで拡張された内容を説明します。

MenuResouceからコンテンツを生成する

まずはMenuResouceを作成します。

サンプルではres/menu以下にpopup.xmlファイルを作成してMenuItemが3つ存在するメニューを準備しています。

■res/menu/popup.xml

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

    <item
        android:id="@+id/item2"
        android:title="MenuItem2"></item>

    <item
        android:id="@+id/item3"
        android:title="MenuItem3"></item>
</menu>

ここまではHoneycombと同様です。ICSではPopupMenuクラスにinflateメソッドが追加されているのでこのメソッドでMenuResouceのIDを指定することでコンテンツを生成することができます。

サンプルのPopupMenuを生成している箇所を見てみましょう。5行目で先ほど準備したMenuResouce(popup.xml)からコンテンツを生成しています。

■src/MainActivity.java

// ボタンをアンカーとして指定して、PopupMenuクラスのインスタンスを生成する
PopupMenu popupMenu = new PopupMenu(getApplicationContext(), button);

// MenuResourceからコンテンツを生成する
popupMenu.inflate(R.menu.popup);

メニューが破棄された(消えた)ことを受け取る

ICSからPopupMeneクラスにsetOnDismissListenerメソッドが追加されPopupMenu.OnDismissListenerクラスを登録することができます。

PopupMenuが消える時にonDismissメソッドが呼ばれることで必要な処理を実行することが可能になります。Dialogクラスと同様ですね。

サンプルではPopupMenuが消える際にトーストを表示するようにしています。

■src/MainActivity.java

// OnDismissListenerを登録する
popupMenu.setOnDismissListener(new OnDismissListener() {

    // ポップアップメニューが消えた時に呼ばれる
    @Override
    public void onDismiss(PopupMenu menu) {
        Toast.makeText(getApplicationContext(), "Dismiss", Toast.LENGTH_SHORT).show();
    }
});

PopupMenuクラスにAndroid4.0(ICS)から追加されたメソッドのまとめ

以下の2つのメソッドが追加されました。

メソッド名内容
inflateMenuResouceのIDを指定してコンテンツを生成する
setOnDismissListenerPopupMenu.OnDismissListenerを登録して、PopupMenuが消える(破棄される)タイミングをハンドリングする

これらのメソッドを使うことで以下のことが可能になります。

  • MenuResuceのIDから簡単にコンテンツを生成すること
  • ポップアップメニューが消えるタイミングに処理を行う