dialog全屏那些事

好久没有更新博客了,下面开始,Android开发很多时候会遇到使用dialog全屏,让dialog全屏并且区域底部的一种情况很多时候不太好弄,下面来介绍一下

上代码

首先看下效果,下面我一个拍照使用的对话框,选择拍照和选择相册的dialog


就这效果大笑

首先需要在style.xml中设置全屏的样式

<!-- 全屏显示dialog对话框-->
<style name="camera_dialog_no_screen">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowBackground">@color/bg_back_gray</item>
    <item name="android:windowFrame">@null</item>
    <item name="android:backgroundDimEnabled">true</item>
</style>

然后color.xml文件有个背景色,你可以根据你的项目需要自定义

<color name="bg_back_gray">#F6F4F4</color>
然后你使用dialog的时候需要注意

Dialog mDialog = new android.app.AlertDialog.Builder(context, R.style.camera_dialog_no_screen).create();
使用到刚刚的样式了对吧,还没完呢,继续往下

接下来说下遇到虚拟按键的手机怎么处理,比如说华为和nexus手机下面的返回按键和Home键都是虚拟的,

dialog框最好不要盖住这个键盘,下面好一个工具类

public class NavigationBarUtil {
    /**
     * 获取底部栏的高度
     *
     * @param context
     * @return
     */
    public static int getNavigationBarHeight(Context context) {

        if (!hasSoftKeys((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))) {
            return 0;
        }
        Resources resources = context.getResources();
        int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
        int height = resources.getDimensionPixelSize(resourceId);
        Log.e("mcoy", "the height is " + height);
        return height;
    }

    /**
     * 判断是否有底部工具栏
     *
     * @param windowManager
     * @return
     */
    public static boolean hasSoftKeys(WindowManager windowManager) {
        Display d = windowManager.getDefaultDisplay();

        DisplayMetrics realDisplayMetrics = new DisplayMetrics();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            d.getRealMetrics(realDisplayMetrics);
        }

        int realHeight = realDisplayMetrics.heightPixels;
        int realWidth = realDisplayMetrics.widthPixels;

        DisplayMetrics displayMetrics = new DisplayMetrics();
        d.getMetrics(displayMetrics);

        int displayHeight = displayMetrics.heightPixels;
        int displayWidth = displayMetrics.widthPixels;

        return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;
    }
}

这个工具类就是计算虚拟键盘高度的,其实虚拟键盘也是一个dialog啦

有了虚拟键盘的高度,然后把dialog框距离底部这个高度布局可以啦,就这么简单,注意一下哈,上面的方法返回一个boolean型,就是判断有木有虚拟键盘的

如果有的话就需要设置这个高度,没有就不要设置啦

下面看我的一个demo

下面的这个是一个方法里面的,小伙伴们根据需要自己自定义了哈,我就不写了


Dialog mDialog = new android.app.AlertDialog.Builder(context, R.style.camera_dialog_no_screen)
.create();
WindowManager wmManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);boolean hasSoft = NavigationBarUtil.hasSoftKeys(wmManager);//判断是否有虚拟键盘if (hasSoft) { int navigationBarHeight = NavigationBarUtil.getNavigationBarHeight(context);//获取虚拟键盘的高度 //这一行很重要,将dialog对话框设置在虚拟键盘上面 resetDialogScreenPosition(mDialog, Gravity.BOTTOM, 0, navigationBarHeight, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);} else { resetDialogScreenPosition(mDialog, Gravity.BOTTOM, 0, 0, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);}mDialog.setCancelable(true);mDialog.setCanceledOnTouchOutside(true);mDialog.show();Window window = mDialog.getWindow();window.setContentView(R.layout.dialog_camera);
//window.setWindowAnimations(R.style.camera_dialog_enter_exit);//设置进入退出的动画,如果你不需要就去掉这行代码


restDialogScreenPosition()这个方法就是设置dialog的位置的方法,很清楚吧,看下传入的参数

/**
 * 设置Dialog在屏幕中的位置
 * @param dialog 设置的Dialog对象
 * @param gravity 设置Dialog的起始位置
 * @param xOffset 设置Dialog相对于起始位置的X偏移量
 * @param yOffset 设置Dialog相对于起始位置的Y偏移量
 * @param width 设置Dialog的显示宽度
 * @param height 设置Dialog的显示高度
 */
public static final void resetDialogScreenPosition(Dialog dialog, int gravity, int xOffset, int yOffset, int width, int height) {
    Window dialogWindow = dialog.getWindow();
    WindowManager.LayoutParams lp = dialogWindow.getAttributes();
    dialogWindow.setGravity(gravity);
    lp.x = xOffset; // 新位置X坐标
    lp.y = yOffset; //新位置Y坐标
    lp.dimAmount = 0.4f;
    lp.width = width; // 宽度
    lp.height = height; // 高度
    dialogWindow.setAttributes(lp);
}
你可以把这个方法弄出去,做成工具类,这里我就不做了,然后调用也是可以的哟 大笑

好了就这么多啦,其实这个灰常简单啦,如有问题请留言,



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值