好久没有更新博客了,下面开始,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); }你可以把这个方法弄出去,做成工具类,这里我就不做了,然后调用也是可以的哟
![大笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
好了就这么多啦,其实这个灰常简单啦,如有问题请留言,