Android PupopWindow适配全面屏 全屏显示覆盖状态栏 简单实用只需两步

开发中有一个需求弹出一个弹窗广告,背景需要半透明全屏显示,覆盖状态栏(见下图)。我选用了PupopWindow实现。
在这里插入图片描述

然后设置了属性宽高为WindowManager.LayoutParams.MATCH_PARENT
结果可想而知,根本无法全屏显示,状态栏部分无法遮盖。看网上有很多方法,都说需要自定义PopupWindow,我觉得实现一个全屏显示就需要自定义太麻烦了。就开始找查资料,找方法。

最后得出了一个两步解决问题的方法:

第一步:获取屏幕的高,设置popupWindow的高为屏幕的高+顶部状态栏的高+底部虚拟按键的高

 int height = getResources().getDisplayMetrics().heightPixels;// 屏幕的高
 actionPopupWindow = new PopupWindow(view, WindowManager.LayoutParams.MATCH_PARENT, height + getStatusBarHeight(mContext) + getBottomKeyboardHeight(mContext));//设置popupWindow的高为屏幕的高+顶部状态栏的高+底部虚拟按键的高
 /**
     * 获取状态栏高度
     *
     * @param context context
     * @return 状态栏高度
     */
    public static int getStatusBarHeight(Context context) {
        // 获得状态栏高度
        int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        return context.getResources().getDimensionPixelSize(resourceId);
    }

 	/**
     * 获取底部虚拟键盘的高度
     */
    public static int getBottomKeyboardHeight(Activity context) {
        int screenHeight = getAccurateScreenDpi(context)[1];
        DisplayMetrics dm = new DisplayMetrics();
        context.getWindowManager().getDefaultDisplay().getMetrics(dm);
        int heightDifference = screenHeight - dm.heightPixels;
        return heightDifference;
    }

第二步:设置popupWindow属性setClippingEnabled(false);

actionPopupWindow.setClippingEnabled(false);

再运行试下,是不是全屏覆盖显示了?是的。问题解决!就是这么简单2步

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Android系统从5.0开始引入了Material Design风格,其中一个重要的改变是状态栏的颜色和样式。在之前的版本中,状态栏通常是黑色的,而在Material Design中,状态栏可以根据应用程序的主题颜色进行定制化。因此,我们要在不同的Android版本上适配状态栏。 在Android 5.0及以上版本中,我们可以使用以下代码来实现状态栏颜色的定制: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); window.setStatusBarColor(ContextCompat.getColor(this, R.color.status_bar_color)); } ``` 在Android 4.4及以下版本中,我们可以通过设置一个透明的状态栏来模拟状态栏颜色: ```java if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); ViewGroup decorView = (ViewGroup) window.getDecorView(); int statusBarHeight = getStatusBarHeight(); View statusBarView = new View(this); statusBarView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight)); statusBarView.setBackgroundColor(ContextCompat.getColor(this, R.color.status_bar_color)); decorView.addView(statusBarView); ViewGroup rootView = (ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0); rootView.setFitsSystemWindows(true); rootView.setClipToPadding(true); } ``` 其中,`getStatusBarHeight()`方法可以获取状态栏的高度。 在Android 6.0及以上版本中,状态栏的颜色还可以与应用程序的主题颜色进行匹配。我们可以在`styles.xml`中定义一个`colorPrimaryDark`属性来指定状态栏颜色: ```xml <item name="colorPrimaryDark">@color/status_bar_color</item> ``` 在代码中,我们可以通过以下方式来设置主题: ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.colorPrimaryDark)); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值