PopupWindow 在Android 7.0后位置不正确,包含Dialog

这个问题大家可能都遇到过,网上也有解决方案,一般都是如下这种:

@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;  //屏幕高度减去 anchor 的 bottom
            setHeight(h);// 重新设置PopupWindow高度
        }
        super.showAsDropDown(anchor);
    }

这种方法能够解决一部分场景下的问题:在Activity/Fragment中弹出PopupWindow,并且没有输入法干扰。

但是在项目中有两个场景这个方法不行,第一是Activity中弹出输入法,这个时候popupWindow的位置会向上移动;第二是在dialog中弹出popupWindow,位置很奇葩。解决方法如下:

Activity中
if (Build.VERSION.SDK_INT < 24) {
          popupWindow.showAsDropDown(anchor);
    } else {
         int[] location = new int[2];
         anchor.getLocationOnScreen(location);
         int y = location[1];
         popupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, y + anchor.getHeight());
  }
Dialog中
if (Build.VERSION.SDK_INT < 24) {
          popupWindow.showAsDropDown(anchor);
    } else {
         int[] location = new int[2];
         anchor.getLocationInWindow(location);
         int y = location[1];
         popupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, y + anchor.getHeight());
  }
我们都知道showAtLocation第一个参数实际并不充当anchor的作用,如果Gravity设置为NO_GRAVITY,第二三个参数偏移量的参照点是左上角,Activity中是屏幕左上角,而Dialog中是Window窗口的左上角。

以上测试基于Android8.1的Nubia系统。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 180,665评论 25赞 708
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 7,627评论 0赞 17
  • -1- 腊月二十八。 还有两天过年,心里满怀着期待。周围张灯结彩,红灯笼挂满了小区的树,彩灯一闪一闪,时不时传来喜...
    葶苈_阅读 542评论 7赞 5
  • 初九,磐桓,利居贞,利建侯。 明 來知徳解 磐:巨石也;中爻艮(六二、六三、九五)有石之象。 桓:大柱也;震阳木(...
    徐寧阅读 976评论 0赞 0
  • 记得小学时候和同学玩瞎子摸人,拿红领巾蒙住眼睛,周围的同学都定住不动,自己在黑暗中独自摸索。步子是小心翼翼的,怕踩...
    lunaryear99阅读 302评论 0赞 0

友情链接更多精彩内容