Android 7.0以上(包含8.0), popupWindow弹窗位置异常, 解决方案

通常我们的App中, 在标题的位置, 点击需要弹出菜单, 效果如下:

这很难吗? 拿起键盘就是干…

public void showAsDropDown(View anchor, int xoff, int yoff) {
    showAsDropDown(anchor, xoff, yoff, DEFAULT_ANCHORED_GRAVITY);
}
  • 1
  • 2
  • 3

但是往往并不是我们想的那样, 至今Android7.0,以上包括(7.1, 8.0) 系统的手机弹窗, 根本不按套路出牌, 以致我们相同的代码, 却有不同的效果. 

喂! 我的标题栏呢??? 被你吃啦???

赶紧给我吐出来!!!

这能难倒我? 浏览器打开> 百度打开> xxx不能正常显示

嗖嗖嗖…

你可能看到这样的代码

if (Build.VERSION.SDK_INT >= 24) {
     int[] location = new int[2];
     anchor.getLocationOnScreen(location);
     // 7.1 版本处理
     if (Build.VERSION.SDK_INT == 25) {
         WindowManager windowManager = (WindowManager) pw.getContentView().getContext().getSystemService(Context.WINDOW_SERVICE);
         if (windowManager != null) {
             int screenHeight = windowManager.getDefaultDisplay().getHeight();
             // PopupWindow height for match_parent, will occupy the entire screen, it needs to do special treatment in Android 7.1
             pw.setHeight(screenHeight - location[1] - anchor.getHeight() - yoff);
         }
     }
     pw.showAtLocation(anchor, Gravity.NO_GRAVITY, xoff, location[1] + anchor.getHeight() + yoff);

 } else {
     pw.showAsDropDown(anchor, xoff, yoff);
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

试试效果, 还真行.

如果你到这里就关掉网页的话, 那我只能说, bug还在向你招手呢? 是不是想让测试MM找你呢? 难道是…(邪恶..)

Android8.0系统, 这样的方式并不能解决,.

终极解决方案(7.0, 7.1, 8.0)

/**
 *
 * @param pw     popupWindow
 * @param anchor v
 * @param xoff   x轴偏移
 * @param yoff   y轴偏移
 */
public static void showAsDropDown(final PopupWindow pw, final View anchor, final int xoff, final int yoff) {
    if (Build.VERSION.SDK_INT >= 24) {
        Rect visibleFrame = new Rect();
        anchor.getGlobalVisibleRect(visibleFrame);
        int height = anchor.getResources().getDisplayMetrics().heightPixels - visibleFrame.bottom;
        pw.setHeight(height);
        pw.showAsDropDown(anchor, xoff, yoff);
    } else {
        pw.showAsDropDown(anchor, xoff, yoff);
    }

} 已经测试过了 可以是使用 int[] location = new int[2]; findViewById(R.id.layout_poi).getLocationOnScreen(location); int x = location[0]; int y = location[1]; showAsDropDown(cityPopup,findViewById(R.id.layout_poi),0,y+findViewById(R.id.layout_poi).getHeight()); 打完收工!

原创文章 35 获赞 47 访问量 9万+

猜你喜欢

转载自blog.csdn.net/wan903531306/article/details/79599557