Android资源收录Manba陪你学AndroidAndroid零散知识

Android7.0显示 PopupWindow位置错误

2017-08-22  本文已影响192人  唠嗑008

在这次项目需要用到PopupWindow,但发现如果你用showAsDropDown()这个方法,让pop显示在某个View的下面,而且pop的高度是match_parent的话,其显示的位置在Android7.0以下系统正常,在7.0和7.1系统显示不正常,点击“打开POP”按钮效果对比如下:

error.png normal.png

相信大家都已经看到问题所在了吧,我希望在点击筛选的时候,让他显示在筛选的下面,结果他把整个窗体都给覆盖了。

原因分析请参考如下文章,目前估计是Google的问题,好像在7.1已经修复了
PopupWindow 在 Android N(7.0) 的兼容性问题

解决方案一
我在24版本使用showAtLocation(View parent, int gravity, int x, int y)。其中parent只要为当前页面的view即可,gravity用Gravity.NO_GRAVITY,x,y为你要显示的位置。如果要显示在某个view的下面,就获取该view的坐标就好。

 if (Build.VERSION.SDK_INT >= 24) {
      //7.0以上系统
       //获取目标控件在屏幕中的坐标位置  
    int[] location = new int[2];
    anchor.getLocationOnScreen(location);
    mPopupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, location[1] );
  } else {
       mPopupWindow.showAsDropDown(anchor);
   }

方法二
重写popWindows的showAsDropDown方法

public class CustomPopupWindowextends PopupWindow {  
  
    public CustomPopupWindow(Context context) {  
        super(context, null);  
    }  
  
    @Override  
    public void showAsDropDown(View anchor) {  
        if (Build.VERSION.SDK_INT >= 24) {  
            Rect rect = new Rect();  
            anchor.getGlobalVisibleRect(rect);  
            int h = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;  
            setHeight(h);  
        }  
        super.showAsDropDown(anchor);  
    }  
}  
上一篇 下一篇

猜你喜欢

热点阅读