优雅解决DialogFragment所有布局问题


关于本文

关于DialogFragment的布局问题,相信很多人都遇到过,如设置背景颜色无效、无法全屏、无法隐藏状态栏等等,而这些问题网上的各种博客也提供许多解决方法。但我查阅了多篇博客之后,发现解决方法很多种,有相同的,也有不同的,太杂了,有的还不一定生效。

经过我自己一番的时间的研究与实操,这里将告诉你,如何以一种非常优雅的方式,统一解决掉你遇到过的几乎所有DialogFragment的布局问题,并告诉你DialogFragment其他一些你可能不知道的东西。

先说Title,本文将以一种不同于大多数网上博文的方式,更优雅、更有效、更统一的解决以下两个问题:

1、实际的显示布局效果错乱问题,如背景颜色、背景透明、设置宽高均无效,无法撑满屏幕等问题。

2、无法隐藏状态栏内容或高度,实现不了沉浸式布局。


对于弹窗Dialog,从Android3.0开始,Google官方就不太推荐使用Dialog了,而是推荐使用DialogFragment,至于原因,本文就不做过多描述了吧,简要说两点,其余更详细的,我会在其他文章里进行归纳、描述。


选DialogFragment不选Dialog的主要原因:


1、DialogFragment本质上也是一个Fragment,其生命周期由FragmentManager统一管理,可做到Activity因为某种原因自动重建时,DialogFragment也可被正确恢复,这点Dialog做不到。

2、由于Fragment本身可以和与之绑定的Activity进行数据通信,因而使用DialogFragment实现的弹窗,也很方便与Activity进行数据通讯。


既然如此,为什么还是会有很多Android开发者更愿意使用Dialog而不太愿意使用DialogFragment呢?主要还是因为Dialog比较独立,使用起来更方便。DialogFragment不熟悉的话,比较多坑,比如本文说的布局显示问题,很多时候,一个正常的布局文件,在Android Studio里显示是正常的,使用Dialog来承载显示也是正常的,但如果使用DialogFragment来承载显示,就不一定正常了,可能会出现各种奇怪的现象,比如:

  • 设置宽高无效
  • 设置背景透明无效
  • 设置背景颜色无效
  • 无法全屏

等等,我有理由相信,初次使用DialogFragment的你,很大概率都遇到过上面所罗列的问题。然后去百度、Google,查到各种博文,会发现解决方法有很多种,有的说在布局文件里多嵌套一层父View,有的说在onCreate方法里头设置某些FLAG,有的说在onCreateView里且在setContentView之前设置window的某些属性,还有的说在onResume里设置window宽高……等等。


事实上,解决方法有多种很正常,关键是正是由于网上说的解决方案太多了,不容易去记住,哪种处理是解决哪个问题的,比如,如果按照上述所说的解决思路,设置宽高无效和设置背景透明无效的处理方式是不一样的,那么下次遇到同样的问题时,可能你还得去重新查。其实有一种更简单、更高效、更优雅的解决方式,可解决几乎所有你遇到的DialogFragment布局显示问题,包括上述罗列的那几个,这就是本文想要告诉你的。



解决DialogFragment布局显示问题的终极解决方案



其实,上面所说到的多种解决思路,有一个共性:就是要解决某个问题,就需要在某个方法被回调之前或者调用某个方法之前,设置某些FLAG、设置某些属性,然后这个共性,这里浓缩为属性的配置时机。因为有一个配置时机的先后问题,因此同样是设置同一个属性,在某句代码或某个方法前设置或者后设置可能得到的效果不一样。在DialogFragment中,onCreate、onCreateView、onResume等都属于生命周期的方法,且是被动调用的,正是因为是被动调用,才会出现各种时机不对的问题。举个例子,看下面的示例代码:

public interface Callback {
   
    void onCallback();
}

private Callback callback;

public void method() {
   
    //...do something
    
    if (callback != null) {
   
        callback.onCallback();
 
  • 20
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yeqiu1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值