Android 自定义 Dialog 大小 位置 样式
16lz
2021-01-23
自定义大小和位置
在Android 5.0以上 自定义Dialog时发现无法横向铺满屏幕
代码大致如下:
Dialog dialog = new Dialog(this);dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);dialog.setContentView(R.layout.dialog_layout);Window dialogWindow = dialog.getWindow();dialogWindow.setGravity(Gravity.BOTTOM);dialogWindow.getDecorView().setPadding(0, 0, 0, 0);WindowManager.LayoutParams lp = dialogWindow.getAttributes();lp.width = WindowManager.LayoutParams.FILL_PARENT;lp.height = WindowManager.LayoutParams.WRAP_CONTENT;dialogWindow.setAttributes(lp);dialog.show();
分析解决办法:
查找父类Dialog的style和theme,发现background背景属性:
到源码一查看
一张.9图片
so 是因为背景的.9图四周 边距太宽的原因,和宽度设置无关。其实是填满了的,只是四周是透明的而已。
接下来说说解决办法:
方法一:自定义style,继承Theme.Dialog,重写背景属性:
<style name="dialog" parent="@android:style/Theme.Dialog"> - "android:windowFrame"
>@null - "android:windowIsFloating">true
- "android:windowIsTranslucent">false
- "android:windowNoTitle">true
- "android:windowBackground">@android:color/white
- "android:backgroundDimEnabled">true
style>
然后在 代码添加Style
Dialog dialog = new Dialog(this,R.style.dialog);
方法二:
/** * 5.0以上默认有个.9图片作为背景,导致不能铺满横向屏幕 */ dialogWindow.setBackgroundDrawableResource(android.R.color.white);
Dialog 位置属性详解:
/** * 获取对话框的窗口对象及参数对象以修改对话框的布局设置, * 可以直接调用getWindow(),表示获得这个Activity的Window * 对象,这样这可以以同样的方式改变这个Activity的属性. */Window dialogWindow = dialog.getWindow();WindowManager.LayoutParams lp = dialogWindow.getAttributes();dialogWindow.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.TOP);/** * lp.x与lp.y表示相对于原始位置的偏移. * 当参数值包含Gravity.LEFT时,对话框出现在左边,所以lp.x就表示相对左边的偏移,负值忽略. * 当参数值包含Gravity.RIGHT时,对话框出现在右边,所以lp.x就表示相对右边的偏移,负值忽略. * 当参数值包含Gravity.TOP时,对话框出现在上边,所以lp.y就表示相对上边的偏移,负值忽略. * 当参数值包含Gravity.BOTTOM时,对话框出现在下边,所以lp.y就表示相对下边的偏移,负值忽略. * 当参数值包含Gravity.CENTER_HORIZONTAL时 * ,对话框水平居中,所以lp.x就表示在水平居中的位置移动lp.x像素,正值向右移动,负值向左移动. * 当参数值包含Gravity.CENTER_VERTICAL时 * ,对话框垂直居中,所以lp.y就表示在垂直居中的位置移动lp.y像素,正值向右移动,负值向左移动. * gravity的默认值为Gravity.CENTER,即Gravity.CENTER_HORIZONTAL | * Gravity.CENTER_VERTICAL. * */lp.x = 100; // 新位置X坐标lp.y = 100; // 新位置Y坐标lp.width = 300; // 宽度lp.height = 300; // 高度lp.alpha = 0.7f; // 透明度// 当Window的Attributes改变时系统会调用此函数,可以直接调用以应用上面对窗口参数的更改,也可以用setAttributes// dialog.onWindowAttributesChanged(lp);dialogWindow.setAttributes(lp);/** * 将对话框的大小按屏幕大小的百分比设置 */// WindowManager m = getWindowManager();// Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用// WindowManager.LayoutParams p = getWindow().getAttributes(); // 获取对话框当前的参数值// p.height = (int) (d.getHeight() * 0.6); // 高度设置为屏幕的0.6// p.width = (int) (d.getWidth() * 0.65); // 宽度设置为屏幕的0.95// dialogWindow.setAttributes(p);
样式
在Android开发过程中经常会遇到需要自定义Dialog的需求,这时候就可能遇到需要透明背景啊,添加输入框,自动弹出软键盘且不能遮盖住输入框等,这个时候可以添加如下样式解决: <style name="dialog" parent="@android:style/Theme.Holo.Light.Dialog"> - "android:windowFrame"
>@color/transparent - "android:windowIsFloating">true
- "android:windowIsTranslucent">false
- "android:windowNoTitle">true
- "android:windowBackground">@color/transparent
- "android:backgroundDimEnabled">true
style> <style name="inputDialog" parent="@android:style/Theme.Holo.Light.Dialog"> - "android:windowFrame"
>@color/transparent - "android:windowIsFloating">true
- "android:windowIsTranslucent">false
- "android:windowNoTitle">true
- "android:windowBackground">@color/transparent
- "android:backgroundDimEnabled">true
- "android:windowSoftInputMode">stateAlwaysVisible
style>
参考资料:
https://blog.csdn.net/u011183394/article/details/51445202
https://blog.csdn.net/wnl_csdn/article/details/53284073
更多相关文章
- android 学习(2)对话框
- 将Android Activity设置成对话框样式
- Android 获取地理位置的经度和纬度
- Android 安装位置 - installLocation简析
- Android普通对话框原理
- Android 对话框
- Android之复选框对话框
- Android之列表对话框
- Android之普通对话框