Android Dialog 设置Margin方式总结
在日常开发中,总是会遇到各种Dialog的使用,调整根据UI设计的不同,会经常调整Dialog在屏幕中的位置,这篇文章主要介绍,在使用DialogFragment时设置Margin的几种方式。
如下是最后实现的效果:
设置两边margin效果:
设置顶部margin效果:
全屏的Dialog设置顶部Margin:
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.LayoutParams
的verticalMargin
属性来实现。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);
}