Android PopupMenu 的使用

Android 輕量化組件 PopupMenu 的使用

估計很多人遇到過這種場景:
要求彈出的PopupWindow里面是一個列表,我們使用時都是在里面套個ListView或RecyclerView ,現在我們不需要在做這樣繁瑣的工作了。
在官方android.support.v7.widget 包下提供的 PopupMenu 組件,已經被越來越多的項目所采用。我們先看一下幾個 app 的效果:





這是一個非常輕量化的上下文菜單組件,簡潔、使用方便。
1.創建資源文件
在 res 目錄下新建 menu 文件夾,這個文件夾主要是來存放菜單資源文件的。我們新建 sample_menu.xml文件:

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

    <item
        android:id="@+id/next"
        android:icon="@mipmap/ic_launcher"
        android:title="下一首播放"/>

    <item
        android:id="@+id/add"
        android:icon="@mipmap/ic_launcher"
        android:title="添加到歌單"/>

    <item
        android:id="@+id/detail"
        android:icon="@mipmap/ic_launcher"
        android:title="歌曲詳情"/>

    <item
        android:id="@+id/del"
        android:icon="@mipmap/ic_launcher"
        android:title="刪除歌曲"/>

</menu>

隨便寫幾個菜單選項。
2.在代碼中展示

private void showPopupMenu(View view) {
        // 這里的view代表popupMenu需要依附的view
        PopupMenu popupMenu = new PopupMenu(MainActivity.this, view);
        // 獲取布局文件
        popupMenu.getMenuInflater().inflate(R.menu.sample_menu, popupMenu.getMenu());
        popupMenu.show();
        // 通過上面這幾行代碼,就可以把控件顯示出來了
        popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                // 控件每一個item的點擊事件
                return true;
            }
        });
        popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() {
            @Override
            public void onDismiss(PopupMenu menu) {
                // 控件消失時的事件
            }
        });

    }
有時候我們還需要根據不同的條件,顯示或隱藏指定的 item,比如在點擊第二個按鈕的時候隱藏掉“刪除歌曲”的選項,只需要添加幾行代碼:

...
popupMenu.show();
switch (view.getId()) {
    case R.id.btn_world:
        popupMenu.getMenu().findItem(R.id.del).setVisible(false);
        break;
    default:
        break;
}
...

有時候我們還需要根據不同的條件,顯示或隱藏指定的 item,比如在點擊第二個按鈕的時候隱藏掉“刪除歌曲”的選項,只需要添加幾行代碼:

...
popupMenu.show();
switch (view.getId()) {
    case R.id.btn_world:
        popupMenu.getMenu().findItem(R.id.del).setVisible(false);
        break;
    default:
        break;
}
...

來看一下效果:




PopupMenu 默認是在指定控件的下方顯示的,但是當檢測到空間不足時,會自動調整顯示的位置。而且自帶動畫效果,是不是很方便呢?
3.在 PopupMenu 中顯示圖標
以前用到帶圖標的菜單時,一般都是通過自定義 PopupWindow 來實現的,比較麻煩,其實 PopupMenu 可以很簡單的實現這個功能,不過需要用到反射。關于反射,我理解的不深,所以下面的代碼也是從網上粘貼過來的。細心的同學可能會發現,在 xml 資源文件中,我在每個 item 標簽里都寫了 icon 的屬性。沒錯,要顯示的正是在這里設置的圖片。當然,如果你不需要顯示圖標的話,icon 是沒有必要寫的。

try {
            Field field = popupMenu.getClass().getDeclaredField("mPopup");
            field.setAccessible(true);
            MenuPopupHelper helper = (MenuPopupHelper) field.get(popupMenu);
            helper.setForceShowIcon(true);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

最終效果:



對于 PopupMenu 的使用暫時想到了這么多,以后如果遇到更多的使用技巧,會再來補充的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容