自定义一个Dialog,继承了系统Dialog的样式。这时候会发现,即使布局文件中写的width和height都是match_parent,依然无法达到全屏的效果。

原因是:系统dialog的样式。默认有padding=10dip,所以即使设置为全屏,也是有10dip的间隙。

如果不得不继承这个样式,还希望改变这个dialog的大小,我们可以尝试重写一个这个Dialog的show()方法。

分析:在Dialog的show()方法中,我们可以看到代码:

 1   WindowManager.LayoutParams l = mWindow.getAttributes();
2 if ((l.softInputMode
3 & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION) == 0) {
4 WindowManager.LayoutParams nl = new WindowManager.LayoutParams();
5 nl.copyFrom(l);
6 nl.softInputMode |=
7 WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION;
8 l = nl;
9 }
10
11 try {
12 mWindowManager.addView(mDecor, l);
13 mShowing = true;
14
15 sendShowMessage();
16 } finally {
17 }

也就是说,大小其实是在show的时候控制的。我们在show之前,即使动态改变这个layoutParams,也是不起作用的。

我是这么写的:

 1 @Override
2 public void show() {
3 super.show();
4 //set the dialog fullscreen
5 FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) mContentView
6 .getLayoutParams();
7 layoutParams.width = display.getWidth();
8 layoutParams.height = display.getHeight();
9 mContentView.setLayoutParams(layoutParams);
10 }

其中,mContentView是整个大布局的view。这样就达到了既继承系统Theme.Dialog样式,又全屏的目的了。

当然,也有人提出,采用其他样式来避开这个问题,我尝试过,有些样式是可以全屏,但多了些我不想要的效果。这样来修改,也算一个解决方案吧。

<!-- 全屏dialog样式 左右插入 -->

<resources>

    <style name="AppTheme" parent="android:Theme.Black"/>
<style name="processDialog" >
<item name="android:windowIsFloating">true</item><!--是否浮现在activity之上-->
<item name="android:windowFullscreen">true</item>
<item name="android:windowIsTranslucent">false</item><!--半透明-->
<item name="android:windowNoTitle">true</item><!--无标题-->
<item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
<item name="android:backgroundDimEnabled">true</item><!--模糊-->
<item name="android:backgroundDimAmount">0.5</item>
<item name="android:alpha">0.3</item>
</style> </resources>

实际适应

<resources>

    <style name="processDialog" >

        <item name="android:windowFullscreen">true</item>  

        <item name="android:windowNoTitle">true</item><!--无标题-->  

    </style>  

</resources>

代码中加载这个view并把view set到dialog上,这样全屏的dialog就完成了

mView = LayoutInflater.from(this).inflate(R.layout.process_dialog, null);
processDialog = new Dialog(LogActivity.this, R.style.processDialog);
processDialog.setCancelable(false);
processDialog.setContentView(mView);
mAutoCloseDialog = new AutoCloseDialog(processDialog);
mAutoCloseDialog.show(Prefs.DIALOG_DISPLAY_TIME);

接下来用一个封装好的类,做一个延时关闭的效果

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import android.app.Dialog; public class AutoCloseDialog{ private Dialog dialog;
private ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); public AutoCloseDialog(Dialog dialog){
this.dialog = dialog;
} public void show(long duration){ Runnable runner = new Runnable() {
public void run() {
dialog.dismiss();
}
};
executor.schedule(runner, duration, TimeUnit.MILLISECONDS);
dialog.show();
} }

下面是创建Dialog的代码:

Dialog dialog = new Dialog(Activity.this, R.style.mydialog);

dialog.setContentView(R.layout.layout);

LayoutParams lay = dialog.getWindow().getAttributes();

setParams(lay);

dialog.show();

下面是设置Dialog的LayoutParams的属性方法:

private void setParams(LayoutParams lay) {

DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

Rect rect = new Rect();

View view = getWindow().getDecorView();

view.getWindowVisibleDisplayFrame(rect);

lay.height = dm.heightPixels - rect.top;

lay.width = dm.widthPixels;

}

http://www.cnblogs.com/lovejoy/p/3527935.html

http://blog.csdn.net/cqupt_chen/article/details/8205055

透明dialog样式

<style name="MyDialogStyle">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
<item name="android:backgroundDimEnabled">true</item>
</style>

Android中关于系统Dialog无法全屏的问题(dialog样式)的更多相关文章

  1. 解决在圆角手机(如小米8)上自定义Dialog无法全屏的问题

    在小米8等一系列圆角的手机上测试项目时,发现我的自定义dialog无法全屏了,这时我的dialog全屏的解决方案还是和网上大部分人是一样的 Window window = getWindow(); i ...

  2. VMWare安装Mac系统后无法全屏显示的问题

    系统: VMTOOLs下载: 链接:https://pan.baidu.com/s/1KIzVWtPrb2vSrtokONToBw 提取码:zea3 1.虚拟机设置--显示器--监视器--指定监视器设 ...

  3. Vmware 中安装 Ubuntu Server (或者ubuntu 以文本界面登陆时) 分辨率无法全屏问题

    Vmware 中安装 Ubuntu Server/Ubuntu 分辨率,无法全屏问题 需要更改grub设置 在终端或者文本界面按下列步骤进行设置: 第一步: 输入命令 sudo vim /etc/de ...

  4. VMware中linux虚拟机无法全屏显示的解决方法(1080P分辨率调节)

    安装了linux(这里以Ubuntu为例)后,发现无法全屏,如下图 即使在设置里面也找不到适合我的显示器的分辨率(我的显示器为1080P) 网上很多人都说是因为没装显卡驱动,其实不是这样的.要解决这个 ...

  5. 解决VMware安装ubuntu16.04后无法全屏的问题

    参考教程:http://www.jb51.net/os/Ubuntu/356462.html 双系统经常崩,故在windows10下装了个ubuntu的虚拟机,安装完成后无法全屏,进入系统设置调试显示 ...

  6. Android中三种超实用的滑屏方式汇总(转载)

    Android中三种超实用的滑屏方式汇总   现如今主流的Android应用中,都少不了左右滑动滚屏这项功能,(貌似现在好多人使用智能机都习惯性的有事没事的左右滑屏,也不知道在干什么...嘿嘿),由于 ...

  7. VirtualBox安装kali linux过程及安装后无法全屏问题解决方法(2)

    ? 1   安装说完了,现在来看看怎么全屏吧,虚拟机无法全屏跟咸鱼有什么区别... 首先打开vbox,选择设备(Device)选项里面最下面安装增强工具那个选项(insert guest additi ...

  8. Java乔晓松-android中调用系统拍照功能并显示拍照的图片

    android中调用系统拍照功能并显示拍照的图片 如果你是拍照完,利用onActivityResult获取data数据,把data数据转换成Bitmap数据,这样获取到的图片,是拍照的照片的缩略图 代 ...

  9. Android中消息系统模型和Handler Looper

    http://www.cnblogs.com/bastard/archive/2012/06/08/2541944.html Android中消息系统模型和Handler Looper 作为Andro ...

随机推荐

  1. 【转载】WEB系统性能问题的分析定位方法

    以一个典型的WEB系统来举例,性能问题一般体现在客户端请求后的响应时间上.在性能测试过程中,即压力增大到某个程度后,响应时间指标迅速增长.但如那篇文章所说,这只能叫做一个现象,测试人员需要找到问题所在 ...

  2. es6 - array for-chrome

    // 去重复 Array.from(new Set([1, 1, 2, 3])); // [1, 2, 3] console.log(Array.from(new Set([1, 1, 2, 3])) ...

  3. linux系统下使用apt-get install 方法安装lamp环境

    1.更新源,获得最近的软件包的列表,列表中包含一些包的信息,比如这个包是否更新过. sudo apt-get update 2.更新系统中已安装的软件包 sudo apt-get upgrade 3. ...

  4. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool。后面三种布尔类型是为了与其他语言兼容而引入的

    bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使 ...

  5. MySQL:ERROR 1067 (42000): Invalid default value for 'end_time'

    © 版权声明:本文为博主原创文章,转载请注明出处 1.错误截图 2.错误分析 表中的第一个TIMESTAMP列(如果未声明为NULL或显示DEFAULT或ON UPDATE子句)将自动分配DEFAUL ...

  6. TI_DSP_SRIO - package type(包格式)

    1.The type of SRIO packageis determined by the combination of Ftype(format type) and Ttype(transacti ...

  7. Swagger跨域访问

    我们用springboot开发完后,需要前端vue用swagger跨域,默认是不能跨域的,所以需要我们后台设置跨域访问,将下面代码完整复制即可. 在springboot项目中新建class : Cor ...

  8. .net验证控件,导航控件

    一.客户端验证(用户体验,减少服务器端压力) 二.服务器端验证(防止恶意攻击,客户端js很容易被绕过) 验证控件:RequiredFieldValidator:字段必填:RangeValidator: ...

  9. hdu 1398 Square Coins 分钱币问题

    Square Coins Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  10. vmware下为CentOS7设置静态IP

    vmware下为CentOS7设置静态IP可以分为三个主要步骤: 1. 在windows中设置VMWare创建的虚拟网络 2. 设置VMWare为静态IP 3. 设置CentOS7的网络为静态IP 首 ...