欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android用PopupWindow实现自定义overflow

程序员文章站 2024-02-29 19:58:10
本文实例为大家分享了popupwindow实现自定义overflow的具体代码,供大家参考,具体内容如下 当action bar的action放不下时,系统会将其收集在o...

本文实例为大家分享了popupwindow实现自定义overflow的具体代码,供大家参考,具体内容如下

当action bar的action放不下时,系统会将其收集在overflow中。

用hierarchyviewer查看系统自己生成的overflow,发现它本身就是popupwindow。

所以我们也可以用popupwindow来写自己的overflow实现更多功能,做出像微信一样的效果。

第一次写,废话有点多,还望多包涵。

效果(gif演示在文章底部):

Android用PopupWindow实现自定义overflow

最右边的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吧。

最终效果:

Android用PopupWindow实现自定义overflow

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。