通常我们的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());
打完收工!