Android 开发过程中,自定义dialog 用得很多,通常都是通过继承Dialog, 再加载自定义的xml来实现。


//自定义Dialogpublic class OrderFilterDialog extends Dialog {    public OrderFilterDialog(Context context) {        super(context);        initView(this);    }    public OrderFilterDialog(Context context, int themeResId) {        super(context, themeResId);        initView(this);    }    public  void initView(Dialog dialog) {        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);        dialog.setContentView(R.layout.dialog_search_order);        show();        dialog.setCancelable(false);        Window window = dialog.getWindow();        WindowManager.LayoutParams lp = window.getAttributes();        lp.width = WindowManager.LayoutParams.MATCH_PARENT;        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;        lp.gravity = Gravity.TOP;        window.setAttributes(lp);        window.setWindowAnimations(R.style.DialogInOutTopAnimation);    }}

运行后,发现效果如下,

Android自定义Dialog的Match_parent无效问题解决_第1张图片

我们发现,match_parent属性根本没有生效。查看Dialog源码才发现,默认Dialog是有一个theme属性的,坑。

Dialog部分代码如下,

/**140     * Creates a dialog window that uses the default dialog theme.141     * 

142 * The supplied {@code context} is used to obtain the window manager and143 * base theme used to present the dialog.144 *145 * @param context the context in which the dialog should run146 * @see android.R.styleable#Theme_dialogTheme147 */148 public Dialog(@NonNull Context context) {149 this(context, 0, true); //默认传入0150 }151152 /**153 * Creates a dialog window that uses a custom dialog style.154 *

155 * The supplied {@code context} is used to obtain the window manager and156 * base theme used to present the dialog.157 *

158 * The supplied {@code theme} is applied on top of the context's theme. See159 * 160 * Style and Theme Resources for more information about defining and161 * using styles.162 *163 * @param context the context in which the dialog should run164 * @param themeResId a style resource describing the theme to use for the165 * window, or {@code 0} to use the default dialog theme166 */167 public Dialog(@NonNull Context context, @StyleRes int themeResId) {168 this(context, themeResId, true);169 }170171 Dialog(@NonNull Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {172 if (createContextThemeWrapper) {173 if (themeResId == 0) {174 final TypedValue outValue = new TypedValue();175 context.getTheme().resolveAttribute(R.attr.dialogTheme, outValue, true); //若值为0,则默认设置dialogTheme样式176 themeResId = outValue.resourceId;177 }178 mContext = new ContextThemeWrapper(context, themeResId);179 } else {180 mContext = context;181 }182183 mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);184185 final Window w = new PhoneWindow(mContext);186 mWindow = w;187 w.setCallback(this);188 w.setOnWindowDismissedCallback(this);189 w.setWindowManager(mWindowManager, null, null);190 w.setGravity(Gravity.CENTER);191192 mListenersHandler = new ListenersHandler(this);193 }

其中

if (themeResId == 0) {
final TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(R.attr.dialogTheme, outValue, true);
themeResId = outValue.resourceId;
}

从上述代码可以看出,若Dialog没有设置默认样式,系统会自动给你适配为R.attr.dialogTheme样式。
而查看themes.xml后,发现 dialogTheme样式是自带有Padding值的,所以match_parent自然是无效的。

那么,如何实现match_parent呢

(1) 设置padding值为0。

dialog.getWindow().getDecorView().setPadding(0, 0, 0, 0);

(2) 自定义一个Theme,覆盖原生Theme。

OrderFilterDialog dialog = new OrderFilterDialog(context, R.style.test);

运行效果如下,

Android自定义Dialog的Match_parent无效问题解决_第2张图片

更多相关文章

  1. Android 主题和样式
  2. android开发:View中android:fadingEdge属性的作用
  3. Android--自定义Dialog,仿IOS对话框样式
  4. Android SeekBar样式修改实现签到效果
  5. 更改CheckBox的样式
  6. android使用gitthub中发Flat-Button样式
  7. 样式定义Android界面样式

随机推荐

  1. C语言——C语言常用关键字总结(新手 还请
  2. wordpress登录失败处理user-lock插件安装
  3. 运维少年系列 python and cisco (1)
  4. 3-11(栈和队列的相互实现)
  5. 运维少年系列 - python and cisco(2)
  6. 10:VMware Horizon View 8.0-证书配置,解决
  7. 运维少年系列 python and cisco (3)
  8. redis高可用集群架构总结
  9. Linux轻量级监控软件-nmon
  10. 今天双十一,给大家送几套视频教程吧