Android用PopupWindow實(shí)現(xiàn)自定義overflow
本文實(shí)例為大家分享了PopupWindow實(shí)現(xiàn)自定義overflow的具體代碼,供大家參考,具體內(nèi)容如下
當(dāng)Action Bar的Action放不下時(shí),系統(tǒng)會(huì)將其收集在overflow中。
用hierarchyviewer查看系統(tǒng)自己生成的Overflow,發(fā)現(xiàn)它本身就是popupWindow。
所以我們也可以用popUpWindow來寫自己的overflow實(shí)現(xiàn)更多功能,做出像微信一樣的效果。
第一次寫,廢話有點(diǎn)多,還望多包涵。
效果(GIF演示在文章底部):
最右邊的Action(那個(gè)三點(diǎn)菜單)是自己添加的Action,使用了android開發(fā)包里的圖標(biāo)ic_action_overflow.png,可到官網(wǎng)下載。
首先在Item中添加Action,為了演示,添加了一個(gè)Submenu
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.popupwindowoverflow.MainActivity" > <item android:id="@+id/action_new" android:orderInCategory="1" android:title="SubMenu" android:icon="@drawable/ic_action_new" app:showAsAction="always"> <menu> <item android:id="@+id/submenu1" android:title="Accept" android:titleCondensed="Accept" android:icon="@drawable/ic_action_accept" /> <item android:id="@+id/submenu2" android:title="Cancel" android:titleCondensed="Cancel" android:icon="@drawable/ic_action_cancel" /> <item android:id="@+id/submenu3" android:title="Unread" android:titleCondensed="Unread" android:icon="@drawable/ic_action_unread" /> </menu> </item> <item android:id="@+id/action_overflow" android:orderInCategory="2" android:title="PopupWindow" android:icon="@drawable/ic_action_overflow" app:showAsAction="always"/> </menu>
監(jiān)聽I(yíng)D為action_overflow的Action,創(chuàng)建popupWindow彈出自己的overflow。
public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); switch (id) { case R.id.action_overflow: popUpMyOverflow();//彈出自定義overflow return true; } return super.onOptionsItemSelected(item); }
下面介紹popUpMyOverflow()方法,就是通過它彈出了我們的overflow,自定義overflow的布局文件就是R.layout.action_overflow_popwindow,這里就不貼出來啦。
public void popUpMyOverflow() { /** * 定位PopupWindow,讓它恰好顯示在Action Bar的下方。 通過設(shè)置Gravity,確定PopupWindow的大致位置。 * 首先獲得狀態(tài)欄的高度,再獲取Action bar的高度,這兩者相加設(shè)置y方向的offset樣PopupWindow就顯示在action * bar的下方了。 通過dp計(jì)算出px,就可以在不同密度屏幕統(tǒng)一X方向的offset.但是要注意不要讓背景陰影大于所設(shè)置的offset, * 否則陰影的寬度為offset. */ // 獲取狀態(tài)欄高度 Rect frame = new Rect(); getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); // 狀態(tài)欄高度:frame.top int xOffset = frame.top+getActionBar().getHeight()-25;//減去陰影寬度,適配UI. int yOffset = Dp2Px(this, 5f); //設(shè)置x方向offset為5dp View parentView = getLayoutInflater().inflate(R.layout.activity_main, null); View popView = getLayoutInflater().inflate( R.layout.action_overflow_popwindow, null); PopupWindow popWind = new PopupWindow(popView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true);//popView即popupWindow的布局,ture設(shè)置focusAble. //必須設(shè)置BackgroundDrawable后setOutsideTouchable(true)才會(huì)有效。這里在XML中定義背景,所以這里設(shè)置為null; popWind.setBackgroundDrawable(new BitmapDrawable(getResources(), (Bitmap) null)); popWind.setOutsideTouchable(true); //點(diǎn)擊外部關(guān)閉。 popWind.setAnimationStyle(android.R.style.Animation_Dialog); //設(shè)置一個(gè)動(dòng)畫。 //設(shè)置Gravity,讓它顯示在右上角。 popWind.showAtLocation(parentView, Gravity.RIGHT | Gravity.TOP, yOffset, xOffset); }
在android中,為了適配不同屏幕密度和尺寸,android用了Dp單位,但是在Java代碼中多是接受px單位的尺寸,所以這里要轉(zhuǎn)換一下。
Dp轉(zhuǎn)換Px的方法。
public int Dp2Px(Context context, float dp) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); }
好的,現(xiàn)在我們有了所有要顯示自定義Overflow的東西了!運(yùn)行你的app吧。
最終效果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android 使用PopupWindow實(shí)現(xiàn)彈出更多的菜單實(shí)例詳解
- Android簡(jiǎn)單實(shí)現(xiàn)自定義彈框(PopupWindow)
- Android編程實(shí)現(xiàn)的自定義彈窗(PopupWindow)功能示例
- android PopupWindow點(diǎn)擊外部和返回鍵消失的解決方法
- Android popupwindow簡(jiǎn)單使用方法介紹
- Android PopupWindow全屏詳細(xì)介紹及實(shí)例代碼
- Android組件popupwindow使用方法詳解
- Android自定義popupwindow實(shí)例代碼
- Android自定義仿微信PopupWindow效果
- android自定義popupwindow仿微信右上角彈出菜單效果
- Popupwindow 的簡(jiǎn)單實(shí)用案例(顯示在控件下方)
相關(guān)文章
FragmentTabHost FrameLayout實(shí)現(xiàn)底部導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了FragmentTabHost和FrameLayout實(shí)現(xiàn)底部導(dǎo)航欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03android獲取情景模式和鈴聲 實(shí)現(xiàn)震動(dòng)、鈴聲提醒
這篇文章主要介紹了android獲取情景模式和鈴聲,實(shí)現(xiàn)震動(dòng)、鈴聲提醒,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android實(shí)現(xiàn)app應(yīng)用多語言切換功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)app應(yīng)用多語言切換功能的相關(guān)資料,類似于微信的語言切換,感興趣的小伙伴們可以參考一下2016-08-08從源代碼分析Android Universal ImageLoader的緩存處理機(jī)制
這篇文章主要介紹了從源代碼分析Android Universal ImageLoader的緩存處理機(jī)制 的相關(guān)資料,需要的朋友可以參考下2016-01-01深入Android HandlerThread 使用及其源碼完全解析
這篇文章主要介紹了深入Android HandlerThread 使用及其源碼完全解析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08Android編程簡(jiǎn)易實(shí)現(xiàn)XML解析的方法詳解
這篇文章主要介紹了Android編程簡(jiǎn)易實(shí)現(xiàn)XML解析的方法,結(jié)合實(shí)例形式總結(jié)分析了Android操作xml文件的各種常見技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08Android搜索框(SearchView)的功能和用法詳解
這篇文章主要為大家詳細(xì)介紹了Android搜索框SearchView的功能和用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Android進(jìn)階CameraX與Camera2使用比對(duì)詳解
這篇文章主要為大家介紹了Android進(jìn)階CameraX與Camera2使用比示例對(duì)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01