web-dev-qa-db-ja.com

「ActionBar」アイテムのクリック時にポップアップメニューを表示する

ActionBarにアクションアイテムがあります。アクションアイテムをクリックした後、ポップアップメニューを表示したいと思います。このメソッドを実装しましたが、レイアウトからのビューではなく、アクションアイテムまたはActionBarに固定します。 MenuItemからアンカーするためのある種のビューを取得する方法は?

public boolean onOptionsItemSelected(MenuItem item) {
    PopupMenu popupMenu = new PopupMenu(this, ??????); // What view goes here?
    popupMenu.inflate(R.menu.counters_overflow);
    popupMenu.show();
    // ...
    return true;
}
47
pcu

それでようやく解決策を見つけました。ポップアップメニューをActionBarのActionItemに固定する場合、ActionItemをレンダリングするビューを見つける必要があります。 findViewById()を使用した単純な検索ビュー。idはxmlのメニュー項目のIDと同じです。

ポップアップの表示:

public boolean onOptionsItemSelected(MenuItem item) {
    // ...

    View menuItemView = findViewById(R.id.menu_overflow); // SAME ID AS MENU ID
    PopupMenu popupMenu = new PopupMenu(this, menuItemView); 
    popupMenu.inflate(R.menu.counters_overflow);
    // ...
    popupMenu.show();
    // ...
    return true;
}

メニュー:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >

     ....

     <item
    Android:id="@+id/menu_overflow"
    Android:icon="@drawable/ic_overflow"
    Android:showAsAction="ifRoom"
    Android:title="@string/menu_overflow"/>

     ....

</menu>

メニュー項目が表示されない(オーバーフローしている)場合、機能しません。 findViewByIdはnullを返すため、この状況を確認して別のビューに固定する必要があります。

115
pcu