Android中PopupMenu組件的使用實(shí)例
最近學(xué)習(xí)研究了一下Android中PopupMenu組件的使用,發(fā)現(xiàn)很實(shí)用,所以留個(gè)筆記留作日后查詢
估計(jì)很多人遇到過(guò)這種場(chǎng)景:
要求彈出的PopupWindow里面是一個(gè)列表,我們使用時(shí)都是在里面套個(gè)ListView或RecyclerView ,現(xiàn)在我們不需要在做這樣繁瑣的工作了。
在官方android.support.v7.widget 包下提供的 PopupMenu 組件,已經(jīng)被越來(lái)越多的項(xiàng)目所采用。我們先看一下幾個(gè) app 的效果:
這是一個(gè)非常輕量化的上下文菜單組件,簡(jiǎn)潔、使用方便。
1.創(chuàng)建資源文件
在 res 目錄下新建 menu 文件夾,這個(gè)文件夾主要是來(lái)存放菜單資源文件的。我們新建 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ě)幾個(gè)菜單選項(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(); // 通過(guò)上面這幾行代碼,就可以把控件顯示出來(lái)了 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { // 控件每一個(gè)item的點(diǎn)擊事件 return true; } }); popupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() { @Override public void onDismiss(PopupMenu menu) { // 控件消失時(shí)的事件 } }); }
有時(shí)候我們還需要根據(jù)不同的條件,顯示或隱藏指定的 item,比如在點(diǎn)擊第二個(gè)按鈕的時(shí)候隱藏掉“刪除歌曲”的選項(xiàng),只需要添加幾行代碼:
... popupMenu.show(); switch (view.getId()) { case R.id.btn_world: popupMenu.getMenu().findItem(R.id.del).setVisible(false); break; default: break; } ...
有時(shí)候我們還需要根據(jù)不同的條件,顯示或隱藏指定的 item,比如在點(diǎn)擊第二個(gè)按鈕的時(shí)候隱藏掉“刪除歌曲”的選項(xiàng),只需要添加幾行代碼:
... popupMenu.show(); switch (view.getId()) { case R.id.btn_world: popupMenu.getMenu().findItem(R.id.del).setVisible(false); break; default: break; } ...
來(lái)看一下效果:
PopupMenu 默認(rèn)是在指定控件的下方顯示的,但是當(dāng)檢測(cè)到空間不足時(shí),會(huì)自動(dòng)調(diào)整顯示的位置。而且自帶動(dòng)畫(huà)效果,是不是很方便呢?
3.在 PopupMenu 中顯示圖標(biāo)
以前用到帶圖標(biāo)的菜單時(shí),一般都是通過(guò)自定義 PopupWindow 來(lái)實(shí)現(xiàn)的,比較麻煩,其實(shí) PopupMenu 可以很簡(jiǎn)單的實(shí)現(xiàn)這個(gè)功能,不過(guò)需要用到反射。關(guān)于反射,我理解的不深,所以下面的代碼也是從網(wǎng)上粘貼過(guò)來(lái)的。細(xì)心的同學(xué)可能會(huì)發(fā)現(xiàn),在 xml 資源文件中,我在每個(gè) item 標(biāo)簽里都寫(xiě)了 icon 的屬性。沒(méi)錯(cuò),要顯示的正是在這里設(shè)置的圖片。當(dāng)然,如果你不需要顯示圖標(biāo)的話,icon 是沒(méi)有必要寫(xiě)的。
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(); }
最終效果:
對(duì)于 PopupMenu 的使用暫時(shí)想到了這么多,以后如果遇到更多的使用技巧,會(huì)再來(lái)補(bǔ)充的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(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)頁(yè)面點(diǎn)擊頂部彈出下拉菜單
- android自定義popupwindow仿微信右上角彈出菜單效果
- Android PopupWindow實(shí)現(xiàn)右側(cè)、左側(cè)和底部彈出菜單
- Android使用Activity實(shí)現(xiàn)從底部彈出菜單或窗口的方法
- Android 使用PopupWindow實(shí)現(xiàn)彈出更多的菜單實(shí)例詳解
- Android開(kāi)發(fā)使用PopupMenu創(chuàng)建彈出式菜單完整實(shí)例
相關(guān)文章
Activity與Service之間交互并播放歌曲的實(shí)現(xiàn)代碼
以下是對(duì)Activity與Service之間交互并播放歌曲的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下2013-07-07Android開(kāi)發(fā)之AlertDialog實(shí)現(xiàn)彈出對(duì)話框
這篇文章主要為大家詳細(xì)介紹了Android開(kāi)發(fā)之AlertDialog實(shí)現(xiàn)彈出對(duì)話框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09Android獲取應(yīng)用版本號(hào)與版本名稱
這篇文章主要介紹了Android獲取應(yīng)用版本號(hào)與版本名稱的相關(guān)資料,需要的朋友可以參考下2016-03-03Android JSON數(shù)據(jù)與實(shí)體類之間的相互轉(zhuǎn)化(GSON的用法)
這篇文章主要介紹了Android JSON數(shù)據(jù)與實(shí)體類之間的相互轉(zhuǎn)化(GSON的用法),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-01-01Android中網(wǎng)絡(luò)框架簡(jiǎn)單封裝的實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于Android中網(wǎng)絡(luò)框架簡(jiǎn)單封裝的實(shí)例方法,需要的朋友們可以學(xué)習(xí)下。2020-03-03Android基于Glide v4.x的圖片加載進(jìn)度監(jiān)聽(tīng)
本篇文章主要介紹了基于Glide v4.x的圖片加載進(jìn)度監(jiān)聽(tīng)的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08Android編程簡(jiǎn)單解析JSON格式數(shù)據(jù)的方法示例
這篇文章主要介紹了Android編程簡(jiǎn)單解析JSON格式數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android編程解析json格式數(shù)據(jù)的實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Android編程實(shí)現(xiàn)添加低電流提醒功能的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)添加低電流提醒功能的方法,涉及Android廣播監(jiān)聽(tīng)及電源監(jiān)控等相關(guān)操作技巧,需要的朋友可以參考下2017-09-09Android之EditText控制禁止輸入空格和回車(chē)
本文主要介紹了Android中使用EditText控制禁止輸入空格和回車(chē)的實(shí)現(xiàn)代碼。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04