三处设置实现一个状态栏沉浸底部虚拟键不沉浸的底部弹出的全屏Dialog

先看下面的效果图,这个页面并不是一个Activity 而是一个Dialog,这个Dialog是全屏、顶部状态栏沉浸、底部虚拟器露出且支持从底部弹出的对话框,下面让我们通过三处设置来实现这个效果。

一、给Dialog添加Style

public BaseDialog(@NonNull Context context) {
    super(context, R.style.ActionSheetDialogStyle);
    CommonStyleUtil.setStatusTransparentStyle(getWindow(), true);
    setFullScreenAndBottomStyle();
}
<!-- 底部弹窗样式. -->
<style name="ActionSheetDialogStyle" parent="@android:style/Theme.Dialog">

    <!-- 背景透明 -->
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <!-- 浮于Activity之上 这个很关键 要false才可以-->
    <item name="android:windowIsFloating">false</item>
    <!-- 边框 -->
    <item name="android:windowFrame">@null</item>
    <!-- Dialog以外的区域模糊效果 -->
    <item name="android:backgroundDimEnabled">false</item>
    <!-- 无标题 -->
    <item name="android:windowNoTitle">true</item>
    <!-- 半透明 -->
    <item name="android:windowIsTranslucent">true</item>
    <!-- Dialog进入及退出动画 -->
    <item name="android:windowAnimationStyle">@style/DialogBottomAnim</item>
    <item name="android:windowSoftInputMode">stateHidden</item>
</style>

二、设置浸润状态

CommonStyleUtil.setStatusTransparentStyle(getWindow(), true);

/**
 * 设置状态栏透明的风格
 */
public static void setStatusTransparentStyle(Window window, boolean isTextBlack) {
    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        //android 6.0及以上支持改变状态栏字体颜色
        if (isTextBlack) {
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        } else {
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        }
        //这两句加上后 在我的Dialog里面 布局延伸到了状态栏此时要加一定的marginTop值来调整
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        //android 5.0及以上支持改变状态栏为透明状态
        //顶部状态栏透明 这个一定要设置才生效 此处放在6.0以上才执行是因为
        //如果5.0执行了 则透明了 如果背景又是白色 就啥都看不见了 所以5.0要想实现效果需要UI的配合
        window.setStatusBarColor(Color.TRANSPARENT);
    }
}

三、设置全屏和底部弹出

private void setFullScreenAndBottomStyle() {
    WindowManager.LayoutParams params = getWindow().getAttributes();
    params.width = WindowManager.LayoutParams.MATCH_PARENT;
    //这里的height设置为MATCH_PARENT后 5.0的手机顶部状态栏会变成黑色 与Activity的效果不一致
    //但是不设置 在6.0以上的手机 底部虚拟菜单就会隐约不容易看到
    params.height = WindowManager.LayoutParams.MATCH_PARENT;
    getWindow().setAttributes(params);
    getWindow().setGravity(Gravity.BOTTOM);
}

收工!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值