Android Dialog 设置Margin方式总结

在日常开发中,总是会遇到各种Dialog的使用,调整根据UI设计的不同,会经常调整Dialog在屏幕中的位置,这篇文章主要介绍,在使用DialogFragment时设置Margin的几种方式。

如下是最后实现的效果:
设置两边margin效果:

image.png

设置顶部margin效果:

image.png

全屏的Dialog设置顶部Margin:

image.png

1. 设置两边Margin的Dialog

这个比较容易,主要就是设置一个高度wrap_content,宽度match_parent的dialog,然后在dialog的布局中设置margin就可以了。

如果发现宽度match_parent的dialog即使没有设置两边的margin也有margin,可以设置给dialog设置个background来解决window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

如下是xml文件:




    

        
    


然后在DialogFragment的onResume里对Window做一些处理:

 Window window = getDialog().getWindow();
        if (window != null) {
            //去除系统自带的margin
            window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            //设置dialog在界面中的属性
            window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
        }

2. 设置顶部Margin的非全屏Dialog

这种情况margin可以通过WindowManager.LayoutParamsverticalMargin属性来实现。verticalMargin和xml里面设置的layout_margin不一样,verticalMargin是通过设置一个0-1的float变量,来标识margin在屏幕中的占比。

如下是在DialogFragment的onResume中的处理:

Window window = getDialog().getWindow();
        if (window != null) {
            //设置dialog靠近顶部
            window.setGravity(Gravity.TOP);
            window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
            //设置margin为屏幕的20%
            WindowManager.LayoutParams lps = window.getAttributes();
            lps.verticalMargin = 0.2f;
            window.setAttributes(lps);
        }

xml文件(和1的类似,没有什么特别):




    

        
    


3. 设置全屏dialog的margin

这里如果使用2中的方法,没有任何效果。这里使用另外一种方式实现--insetDrawable。

A Drawable that insets another Drawable by a specified distance or fraction of the content bounds. This is used when a View needs a background that is smaller than the View's actual bounds.
It can be defined in an XML file with the element. For more information, see the guide to Drawable Resources.

大意就是:可以设置一个包含另一个Drawable的Drawable,insetDrawable可以让原来的Drawable距离边距有一段距离。常用来实现view需要一个比view实际要小的背景。

这里的实现是在xml里面写一个


     <--相当于设置顶部margin

     <--设置inset背景

    

        
    


在DialogFragment的onResume方法中:

Window window = getDialog().getWindow();
        if (window != null) {
            window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            //设置全屏dialog
            window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
        }

你可能感兴趣的:(Android Dialog 设置Margin方式总结)