Dialog全屏设置

来源:互联网 发布:电影制作软件 编辑:程序博客网 时间:2024/04/29 22:48

一、Dialog的全屏设置

关于Dialog的全屏设置,网上一大把的方法,但是大多数都不全面或者有一些冗余的设置。这里列出一个最基本的全屏设置方式。

public class FullScreenDialog extends Dialog {    public FullScreenDialog(@NonNull Context context) {        super(context);    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //设置一个布局        setContentView(R.layout.dialog_test_fullscreen);        //设置window背景,默认的背景会有Padding值,不能全屏。当然不一定要是透明,你可以设置其他背景,替换默认的背景即可。        getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));        //一定要在setContentView之后调用,否则无效        getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);    }}

其中有两点需要说一下
1. setContentView可以在外部调用,不一定要在自定义的Dialog里面。同理,getWindow().setBackgroundDrawable和getWindow().setLayout也可以在外部调用。如下,

Dialog dialog = new Dialog(this);dialog.setContentView(R.layout.dialog_test_fullscreen);dialog.show();dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

2. 背景色可以通过指定Dialog的Theme来完成

<style name="AppTheme.FullScreenDialog" parent="ThemeOverlay.AppCompat.Dialog">    <item name="android:windowBackground">@android:color/transparent</item></style>Dialog dialog = new Dialog(this, R.style.AppTheme_FullScreenDialog);dialog.setContentView(R.layout.dialog_test_fullscreen);dialog.show();dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

二、AppCompatDialog全屏设置

首先,AppCompatDialog是继承于Dialog的,但是加了一些support v7的一些特性和定制。如果我们直接使用上面的方式来设置,会发现达不到全屏效果,对话框的最顶部会出现部分空白。如下:
这里写图片描述

这个时候,需要额外设置一个属性dialog.supportRequestWindowFeature(Window.FEATURE_NO_TITLE),话说这个属性我找了很久,最后在support design的BottomSheetDialog看到的。如下:

AppCompatDialog dialog = new AppCompatDialog(this, R.style.AppTheme_FullScreenDialog);dialog.supportRequestWindowFeature(Window.FEATURE_NO_TITLE);dialog.setContentView(R.layout.dialog_test_fullscreen);dialog.show();dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

如果是自定义继承于AppCompatDialog,可以直接在构造方法里设置这个属性,完整示例如下:

public class FullScreenDialog extends AppCompatDialog {    public FullScreenDialog(@NonNull Context context) {        super(context);        supportRequestWindowFeature(Window.FEATURE_NO_TITLE);    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //设置一个布局        setContentView(R.layout.dialog_test_fullscreen);        //设置window背景,默认的背景会有Padding值,不能全屏。当然不一定要是透明,你可以设置其他背景,替换默认的背景即可。        getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));        //一定要在setContentView之后调用,否则无效        getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);    }}

三、Supportv7 AlertDialog全屏设置

AlertDialog继承于AppCompatDialog,但是不用设置supportRequestWindowFeature,设置全屏的方式,和普通Dialog一样。如下:

AlertDialog dialog =        new AlertDialog.Builder(this).setTitle("Title")                .setMessage("Message")                .setNegativeButton("Cancel", null)                .setPositiveButton("Sure", null)                .create();dialog.show();dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.YELLOW));dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

更正:

上面说必须设置一个背景才能全屏,说的是默认背景有padding值,说错了,padding不会影响这个,而是因为默认背景有inset值,如下:

<inset xmlns:android="http://schemas.android.com/apk/res/android"       android:insetLeft="16dp"       android:insetTop="16dp"       android:insetRight="16dp"       android:insetBottom="16dp">    <shape android:shape="rectangle">        <corners android:radius="2dp" />        <solid android:color="@android:color/white" />    </shape></inset>