Android用PopupWindow實現自訂overflow_Android

來源:互聯網
上載者:User

本文執行個體為大家分享了PopupWindow實現自訂overflow的具體代碼,供大家參考,具體內容如下

當Action Bar的Action放不下時,系統會將其收集在overflow中。

用hierarchyviewer查看系統自己產生的Overflow,發現它本身就是popupWindow。

所以我們也可以用popUpWindow來寫自己的overflow實現更多功能,做出像微信一樣的效果。

第一次寫,廢話有點多,還望多包涵。

效果(GIF示範在文章底部):

最右邊的Action(那個三點菜單)是自己添加的Action,使用了android開發包裡的表徵圖ic_action_overflow.png,可到官網下載。

首先在Item中添加Action,為了示範,添加了一個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>

監聽ID為action_overflow的Action,建立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的下方。 通過設定Gravity,確定PopupWindow的一般位置。     * 首先獲得狀態列的高度,再擷取Action bar的高度,這兩者相加設定y方向的offset樣PopupWindow就顯示在action     * bar的下方了。 通過dp計算出px,就可以在不同密度螢幕統一X方向的offset.但是要注意不要讓背景陰影大於所設定的offset,     * 否則陰影的寬度為offset.     */    // 擷取狀態列高度    Rect frame = new Rect();    getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);//    狀態列高度:frame.top    int xOffset = frame.top+getActionBar().getHeight()-25;//減去陰影寬度,適配UI.    int yOffset = Dp2Px(this, 5f); //設定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設定focusAble.        //必須設定BackgroundDrawable後setOutsideTouchable(true)才會有效。這裡在XML中定義背景,所以這裡設定為null;    popWind.setBackgroundDrawable(new BitmapDrawable(getResources(),        (Bitmap) null));    popWind.setOutsideTouchable(true); //點擊外部關閉。    popWind.setAnimationStyle(android.R.style.Animation_Dialog);  //設定一個動畫。    //設定Gravity,讓它顯示在右上方。    popWind.showAtLocation(parentView, Gravity.RIGHT | Gravity.TOP,        yOffset, xOffset);  }

在android中,為了適配不同螢幕密度和尺寸,android用了Dp單位,但是在Java代碼中多是接受px單位的尺寸,所以這裡要轉換一下。

Dp轉換Px的方法。

public int Dp2Px(Context context, float dp) {   final float scale = context.getResources().getDisplayMetrics().density;    return (int) (dp * scale + 0.5f);  } 

好的,現在我們有了所有要顯示自訂Overflow的東西了!運行你的app吧。

最終效果:

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.