Android中PopupMenu組件的使用實(shí)例
最近學(xué)習(xí)研究了一下Android中PopupMenu組件的使用,發(fā)現(xiàn)很實(shí)用,所以留個筆記留作日后查詢
估計(jì)很多人遇到過這種場景:
要求彈出的PopupWindow里面是一個列表,我們使用時都是在里面套個ListView或RecyclerView ,現(xiàn)在我們不需要在做這樣繁瑣的工作了。
在官方android.support.v7.widget 包下提供的 PopupMenu 組件,已經(jīng)被越來越多的項(xiàng)目所采用。我們先看一下幾個 app 的效果:


這是一個非常輕量化的上下文菜單組件,簡潔、使用方便。
1.創(chuàng)建資源文件
在 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>
隨便寫幾個菜單選項(xiàng)。
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的點(diǎn)擊事件
return true;
}
});
popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() {
@Override
public void onDismiss(PopupMenu menu) {
// 控件消失時的事件
}
});
}
有時候我們還需要根據(jù)不同的條件,顯示或隱藏指定的 item,比如在點(diǎn)擊第二個按鈕的時候隱藏掉“刪除歌曲”的選項(xiàng),只需要添加幾行代碼:
...
popupMenu.show();
switch (view.getId()) {
case R.id.btn_world:
popupMenu.getMenu().findItem(R.id.del).setVisible(false);
break;
default:
break;
}
...
有時候我們還需要根據(jù)不同的條件,顯示或隱藏指定的 item,比如在點(diǎn)擊第二個按鈕的時候隱藏掉“刪除歌曲”的選項(xiàng),只需要添加幾行代碼:
...
popupMenu.show();
switch (view.getId()) {
case R.id.btn_world:
popupMenu.getMenu().findItem(R.id.del).setVisible(false);
break;
default:
break;
}
...
來看一下效果:


PopupMenu 默認(rèn)是在指定控件的下方顯示的,但是當(dāng)檢測到空間不足時,會自動調(diào)整顯示的位置。而且自帶動畫效果,是不是很方便呢?
3.在 PopupMenu 中顯示圖標(biāo)
以前用到帶圖標(biāo)的菜單時,一般都是通過自定義 PopupWindow 來實(shí)現(xiàn)的,比較麻煩,其實(shí) PopupMenu 可以很簡單的實(shí)現(xiàn)這個功能,不過需要用到反射。關(guān)于反射,我理解的不深,所以下面的代碼也是從網(wǎng)上粘貼過來的。細(xì)心的同學(xué)可能會發(fā)現(xiàn),在 xml 資源文件中,我在每個 item 標(biāo)簽里都寫了 icon 的屬性。沒錯,要顯示的正是在這里設(shè)置的圖片。當(dāng)然,如果你不需要顯示圖標(biāo)的話,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 的使用暫時想到了這么多,以后如果遇到更多的使用技巧,會再來補(bǔ)充的。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android PopupMenu彈出菜單的實(shí)現(xiàn)
- Android編程實(shí)現(xiàn)自定義PopupMenu樣式示例【顯示圖標(biāo)與設(shè)置RadioButton圖標(biāo)】
- Android之用PopupWindow實(shí)現(xiàn)彈出菜單的方法詳解
- android使用PopupWindow實(shí)現(xiàn)頁面點(diǎn)擊頂部彈出下拉菜單
- android自定義popupwindow仿微信右上角彈出菜單效果
- Android PopupWindow實(shí)現(xiàn)右側(cè)、左側(cè)和底部彈出菜單
- Android使用Activity實(shí)現(xiàn)從底部彈出菜單或窗口的方法
- Android 使用PopupWindow實(shí)現(xiàn)彈出更多的菜單實(shí)例詳解
- Android開發(fā)使用PopupMenu創(chuàng)建彈出式菜單完整實(shí)例
相關(guān)文章
GridView基于pulltorefresh實(shí)現(xiàn)下拉刷新 上拉加載更多功能(推薦)
原理和listview一樣 ,都是重寫Android原生控件。下面小編通過實(shí)例代碼給大家分享GridView基于pulltorefresh實(shí)現(xiàn)下拉刷新 上拉加載更多功能,非常不錯,一起看看吧2016-11-11
Android獲取手機(jī)號碼和運(yùn)營商信息的方法
這篇文章主要介紹了Android獲取手機(jī)號碼和運(yùn)營商信息的方法,以實(shí)例形式完整講述了獲取手機(jī)號碼和運(yùn)營商信息的技巧,代碼中包含完整的注釋說明,需要的朋友可以參考下2015-01-01
Android自定義ViewGroup之FlowLayout(三)
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewGroup之FlowLayout,常用于關(guān)鍵字標(biāo)簽,搜索熱詞列表等功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Android Studio 報Integer types not allowed錯誤
本文給大家分享的是在使用Android Studio的過程中遇到的報Integer types not allowed錯誤的分析及解決方法,非常實(shí)用,有需要的小伙伴可以參考下2017-10-10
詳解Android6.0運(yùn)行時權(quán)限管理
自從Android6.0發(fā)布以來,在權(quán)限上做出了很大的變動,不再是之前的只要在manifest設(shè)置就可以任意獲取權(quán)限,而是更加的注重用戶的隱私和體驗(yàn)。本文詳細(xì)介紹了Android6.0運(yùn)行時權(quán)限管理。需要的朋友一起來看下吧2016-12-12

