PopupWindow显示在某个控件的下方showAsDropDown(view),适配7.0版本及以上通常是通过以下方式:
/**
* 适配Android7.0
*/
@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);
}
但是在全面屏手机上却出出现一个问题:popupWindow不能全屏显示。
此时就需要单独兼容 全面屏手机。
首先要了解一下全面屏手机与一般手机在获取屏幕高度的区别,以下三种方式:
方式1:
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getRealMetrics(dm);
int screenHeight1 = dm.heightPixels;
方式2:
WindowManager wm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
int screenHeight2 = outMetrics.heightPixels;
方式3:
int screenHeight3 = anchor.getResources().getDisplayMetrics().heightPixels;
一般手机三种方式打印的结果是:
screenHeight1 = 1960;
screenHeight2 = 1960;
screenHeight3 = 1960;
全面屏手机打印的结果是:
screenHeight1 = 2400;
screenHeight2 = 2198;
screenHeight3 = 2198;
对比会发现手机屏幕高度获取出现了差异,通过打印全面屏手机的状态栏高度和底部功能键栏的高度:
StatusBarHeight = 88;
NavigationBarHeight = 114;
对比发现,原来全面屏手机的方法二和方法三获取的高度去掉了状态栏和底部功能键栏高度,这就找到了解决方式:通过方法一,然后去掉底部功能键栏高度;
/**
* 适配Android7.0
*/
@Override
public void showAsDropDown(View anchor) {
if (Build.VERSION.SDK_INT >= 24) {
Rect rect = new Rect();
anchor.getGlobalVisibleRect(rect);
DisplayMetrics dm = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getRealMetrics(dm);
int screenHeight = dm.heightPixels;
int h = screenHeight - rect.bottom - ImmersionBar.getNavigationBarHeight(activity);
setHeight(h);
}
super.showAsDropDown(anchor);
}
完美解决了全面屏手机适配问题。
ImmersionBar.getNavigationBarHeight(activity) 引用的
'com.gyf.immersionbar:immersionbar-components:3.0.0'