我是真的想哭了,这个DialogFragment全屏的适配,我是真的不想再去碰了。
之前有写过一篇https://www.jianshu.com/p/8a55659cf47c
这里确实是能让Dialog全屏,而且还是遮挡住状态栏的全屏。但不适合所有情况,如果我只想让宽或者高全屏,而不是整个都全屏,那就不太适合使用这种方法,只能去寻求其它的出路。我现在需要只让高度全屏。
结果到现在已经几个月了,一直都没办法完全的适配,过段时间就xxx机型有问题,过段时间就xxx机型有问题。我的内心是真的崩溃,所以说如果你想要使用Dialog来实现全屏的效果,还真的要三思后行,一般都不会用Dialog来做全屏的,但是半全屏还是有可能的。真的,Dialog不能碰,到处都是坑。
机型、版本、各种屏幕(全面屏)、加上逻辑操作上的(比如隐藏状态栏的操作不同导致的效果也不同)等等,一种适配在另一个地方就会出问题,有种拆东墙补西墙的感觉,你解决完这一块的适配,另外一块之前已经解决的又出问题。那每次我给一台特殊的机型做适配的时候,还要把之前没问题的都再检查一遍。
一开始,想要实现全屏,网上大部分都是两种说法,一种是在style中设置,另一种是使用setLayout方法
getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
好,你以为有这么简单,于是有时候莫名其妙的顶部有一段间距。
然后我找到一个方法,把这段代码写到onStart()生命周期中就能解决这个。
但是你以为事情有这么简单?当然要弹出软键盘时,surprised ,DIalog的下半部分会闪一下。然后当时我想出的办法是先在onStart()中设置,然后监听屏幕绘制,完成后获取屏幕高度,再设死给dialog,这样就能解决软键盘弹出时一闪的问题。
但其实这种解决方法想想就觉得很蠢。
之后过一段时间,发现低版本的机型还是出了问题,就和上面一样,状态栏那里被截了一块。
于是我找出了一种新的方法,给dialog的style设置-1,没错,当时我这样做确实让Dialog正常全屏了。
在自定义的dialogfragment的onCreate方法中加入
setStyle(DialogFragment.STYLE_NO_FRAME, -1);
但是生活处处是以外,前段时间,又出现一台华为机沦陷了,还是距顶部有空白的问题(有状态栏的情况正常,没有状态栏的时候就有空白)
于是我又找到了一个方法
getDialog().getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
刺激的是这台机是没问题了,但是换成有状态栏的时候又出了问题。有状态栏的时候,dialog会挡住状态栏,但是状态栏的字会穿透Dialog显示在最上面。
此刻我笑了,笑得像一个孩子一样开心,我是真的绝望。但是说明此时可以从给window设置flags入手不是吗,但是flags有多少你们又不是不知道,虽然有说明,但是我感觉他们都差不多啊,比如
等等,描述我感觉都一样啊,所以只能一个一个试了,最终在我的卧薪尝胆下,我终于找到了一个合适的flag
Window window = getDialog().getWindow();
WindowManager.LayoutParams winParams = window.getAttributes();
winParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
没错,就是这个FLAG_LAYOUT_INSET_DECOR
既能在有状态栏的情况下贴着状态栏的下边,又能在没有状态栏的情况下高度全屏显示。
你以为事情就能这样解决?
过了一段时间之后。。。。。。
低版本的红米手机又出现间隔的问题了。。。。。。
什么?你问我怎么解决的?我已经不想解决了。这个东西就特么是一个坑,最好的解决办法就是把DialogFragment相关的代码删掉,这样你就爽快了。
最后我用下面代码能暂时解决所有机型的问题(但不能保证之后不会有问题)
Window window = getDialog().getWindow();
WindowManager.LayoutParams winParams = window.getAttributes();
winParams.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN;
但是用
getDialog().getWindow().setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
不行,我感觉这两个的设置方式是一样的啊,没想到还有差别
网友评论