Android Dialog 设置Margin方式总结

2018-05-08  本文已影响1168人  zeyio

在日常开发中,总是会遇到各种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文件:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:layout_marginLeft="30dp"    <---设置margin
        android:layout_marginRight="30dp"
        android:gravity="center"
        android:background="@color/colorAccent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="设置两边的margin"
            android:textColor="@android:color/white"
            android:textSize="30sp" />
    </LinearLayout>

</FrameLayout>

然后在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的类似,没有什么特别):

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="0dp"
    android:layout_marginRight="0dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="300dp"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:gravity="center"
        android:background="@color/colorAccent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="设置顶部的margin"
            android:textColor="@android:color/white"
            android:textSize="30sp" />
    </LinearLayout>

</FrameLayout>

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 <inset> element. For more information, see the guide to Drawable Resources.

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

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

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@color/colorAccent"
    android:insetTop="100dp"/>     <--相当于设置顶部margin
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="0dp"
    android:layout_marginRight="0dp"
    android:background="@drawable/inner_dialog_bg">     <--设置inset背景

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="设置全屏Dialog的margin"
            android:textColor="@android:color/white"
            android:textSize="20sp" />
    </LinearLayout>

</FrameLayout>

在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);
        }
上一篇下一篇

猜你喜欢

热点阅读