自定义大小和位置

在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 大小 位置 样式_第1张图片

到源码一查看
Android 自定义 Dialog 大小 位置 样式_第2张图片
一张.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">truestyle>

然后在 代码添加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

更多相关文章

  1. android 学习(2)对话框
  2. 将Android Activity设置成对话框样式
  3. Android 获取地理位置的经度和纬度
  4. Android 安装位置 - installLocation简析
  5. Android普通对话框原理
  6. Android 对话框
  7. Android之复选框对话框
  8. Android之列表对话框
  9. Android之普通对话框

随机推荐

  1. android摄像头采集和预览-第二种方法
  2. android textView加边框
  3. xarmain使用Forms编译android工程出现sup
  4. 2013.04.03——— android 图片缓存之二L
  5. Android(安卓)AbsListView
  6. Android Shape关键字意思
  7. Android开发由eclipse转Android Studio中
  8. Android 的相对布局的一些使用
  9. Android 6.0关于电话的各种Call和Connect
  10. Android内嵌H5(2)