自定义一个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. 关于websocket和ajax无刷新

    HTTP无状态: Ajax只能实现用户和服务器单方面响应(单工机制). 如果设置为长轮询(ajax设置多少秒进行一次请求,时间间隙可能会有延迟,且浪费资源) 如果设置为长连接(客户端请求一次,服务器保 ...

  2. Git提交时提示‘The file will have its original line endings in your working directory’

    Git提交时提示'The file will have its original line endings in your working directory' Git出现错误 git add -A ...

  3. Velocity.js动画库使用

    1.简介 Velocity 是一个简单易用.高性能.功能丰富的轻量级JS动画库.它能和 jQuery 完美协作,并和$.animate()有相同的 API, 但它不依赖 jQuery,可单独使用. 2 ...

  4. Nginx 简单的负载均衡配置演示样例

    近期在做开放查询应用的时候,因为数据两天特别多,两千多万条呢,用户訪问需求也比較大,所以就用nginx做了 负载均衡,以下是改动之后的相关内容. http://www.cnblogs.com/xiao ...

  5. Odoo 11 Backend

    Table of Contents 命令入口 服务器 启动server thread 模式 prefork 模式 gevent模式 wsgi 应用 响应 客户端请求 xmlrpc web http路由 ...

  6. 后期给项目加入Git版本控制

    一.为项目加上Git 1.进入对应文件夹 2.git init(初始化一个空的代码仓库) 3.git add .(将当前目录和子目录的文件标记为要添加到代码仓库) 4.git commit -m &q ...

  7. 如何为Apache JMeter开发插件(二)—第一个JMeter插件

    文章内容转载于:http://lib.csdn.net/article/softwaretest/25700,并且加上个人一些截图 本篇将开启为JMeter开发插件之旅,我们选择以Function(函 ...

  8. SlidingMenu+Fragment实现当前最流行的侧滑

    1 http://www.krislq.com/2013/03/android_case_slidingmenu_fragment/ 2 https://github.com/jfeinstein10 ...

  9. Lua学习十一----------Lua迭代器

    © 版权声明:本文为博主原创文章,转载请注明出处 Lua迭代器 - 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址 - Lu ...

  10. [Erlang危机](5.1.1)内存

    原创文章,转载请注明出处:server非业余研究http://blog.csdn.net/erlib 作者Sunface , and some of the hidden data I mention ...