Android 自定义 Dialog 大小 位置 样式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tgvincent/article/details/82218645

自定义大小和位置

在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背景属性:
Android 自定义 Dialog 无法横向铺满屏幕

到源码一查看
Android 自定义 Dialog 无法横向铺满屏幕
一张.9图片
so 是因为背景的.9图四周 边距太宽的原因,和宽度设置无关。其实是填满了的,只是四周是透明的而已。

接下来说说解决办法:
方法一:自定义style,继承Theme.Dialog,重写背景属性:

<style name="dialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">false</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/white</item>
        <item name="android:backgroundDimEnabled">true</item>
</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">  
    <item name="android:windowFrame">@color/transparent</item><!-- 边框 -->  
    <item name="android:windowIsFloating">true</item><!-- 是否浮现在activity之上 -->  
    <item name="android:windowIsTranslucent">false</item><!-- 半透明 -->  
    <item name="android:windowNoTitle">true</item><!-- 无标题 -->  
    <item name="android:windowBackground">@color/transparent</item><!-- 自己想要的背景 -->  
    <item name="android:backgroundDimEnabled">true</item><!-- 模糊 -->  
</style>  

<!--带输入框-->  
<style name="inputDialog" parent="@android:style/Theme.Holo.Light.Dialog">  
    <item name="android:windowFrame">@color/transparent</item><!-- 边框 -->  
    <item name="android:windowIsFloating">true</item><!-- 是否浮现在activity之上 -->  
    <item name="android:windowIsTranslucent">false</item><!-- 半透明 -->  
    <item name="android:windowNoTitle">true</item><!-- 无标题 -->  
    <item name="android:windowBackground">@color/transparent</item><!-- 自己想要的背景 -->  
    <item name="android:backgroundDimEnabled">true</item><!-- 模糊 -->  
    <item name="android:windowSoftInputMode">stateAlwaysVisible</item><!--显示软件盘-->  
</style>

参考资料:

https://blog.csdn.net/u011183394/article/details/51445202

https://blog.csdn.net/wnl_csdn/article/details/53284073

猜你喜欢

转载自blog.csdn.net/tgvincent/article/details/82218645