最近遇到一个奇葩问题,导航栏多个Fragment沉浸,fitsSystemWindows = true只在一个Fragment有效,其他Fragment都是无效的(即:toolbar和状态栏重叠)

这种问题产生的原因:当第一个Fragment添加到Activity中的时候,Activity寻找出有fitsSystemWindows的子布局为其预留出状态栏的空间,其实就是设置一个padding,而其他Fragment添加到Activity中的时候,因为状态栏空间的适配已经被消费过一次了,Activity并不会再次去添加这个padding。因此我们需要自定义一个FrameLayout,重写它的状态栏空间适配的时机和它的适配事件的分发。

经过一系列翻查,测试,最终找到了一种合适的处理方案,废话不多说一起来看一下吧!

public class WindowInsetsFrameLayout extends FrameLayout {

public WindowInsetsFrameLayout(Context context) {

this(context, null);

}

public WindowInsetsFrameLayout(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)

public WindowInsetsFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

setOnHierarchyChangeListener(new OnHierarchyChangeListener() {

@Override

public void onChildViewAdded(View parent, View child) {

requestApplyInsets();

}

@Override

public void onChildViewRemoved(View parent, View child) {

}

});

}

@TargetApi(Build.VERSION_CODES.KITKAT_WATCH)

@Override

public WindowInsets onApplyWindowInsets(WindowInsets insets) {

int childCount = getChildCount();

for (int index = 0; index < childCount; index++)

getChildAt(index).dispatchApplyWindowInsets(insets);

return insets;

}

}

因为Fragment是添加到FrameLayout这个容器的,我们给他设置一个布局层次结构改变的监听,当Fragment被添加进去的时候,通过requestApplyInsets()方法使Activity重新进行一次状态栏空间的适配,因为FrameLayout中还有其他的Fragment,我们还需要重写onApplyWindowInsets方法,对其子View进行遍历,逐个分发状态栏空间的适配事件。

android getwindow 在fragment不能使用,Android Fragment 布局使用 fitsSystemWindows = true 无效解决方案...相关推荐

  1. android 弹出fragment,Android中ViewPager获取当前显示的Fragment

    前言 在项目中,有时会用到在ViewPager中显示同样类型的Fragment,同时这样的Fragment的个数是动态的,但是PagerAdapter没有给我们提供getCurrentFragment ...

  2. Android典型界面设计(4)——使用ActionBar+Fragment实现tab切换

    一.问题描述 之前我们使用ViewPager+Fragment区域内头部导航,在Android 3.0之后Google增加了新的ActionBar,可方便的实现屏幕Head部区域的 设计如返回键.标题 ...

  3. 【译】用Fragment创建动态的界面布局(附Android示例代码)

    原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ...

  4. Android系列之Fragment(二)----Fragment的生命周期和返回栈

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  5. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  6. android fragment动态添加,Android动态添加Fragment

    效果图如下: 项目结构图如下: Fragment1: package com.demo.dongtaifragment; import android.app.Fragment; import and ...

  7. 【Android基础】Fragment 详解之Fragment介绍

    Fragment在Android 3.0( API 11)引入,是为了支持在大屏上显示更加动态.灵活的UI,比如在平板和电视上.Fragment可以看作是嵌套的Activity,类似ActivityG ...

  8. android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...

    现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信.购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...

  9. android fragment framelayout,framelayout中fragment的切换

    我们在android开发中经常会用到fragment,例如侧拉栏的切换,viewPager的切换. 而我们切换fragment无非就两种方法: 1.replace(): 2.add(),hide(), ...

最新文章

  1. Android如何使用读写cookie的方法
  2. 三相全桥电压型PWM逆变器(交直交)Simulink仿真
  3. boost::log::sinks::debug_output_backend用法的测试程序
  4. 移除集合效率高还是add高_效率比较--集合
  5. python的闭包要素_Python的闭包
  6. centos7安装kubernetes1.9集群
  7. c语言能返回字符串吗,C语言中函数返回字符串的四种方法
  8. 杂谈(23)也说高考
  9. Qt SQL 学习笔记二:qt建立数据库,创建和操纵表
  10. dsp的ad标志位是什么_DSP简简单单学习之AD采样
  11. 利用lavarel框架实现Todos App
  12. 洛谷:P5520 [yLOI2019] 青原樱(数学,普及/提高-)
  13. Android高级开发进阶图谱
  14. 红孩儿编辑器的模块设计16
  15. 菜鸟Java开发人员的找工作之旅(1)
  16. DHT11大气温湿度模块+直流电机实现根据温度控制风扇转动
  17. MATLAB---形态学滤波
  18. 父类(指针、引用)指向子类对象
  19. 【毕业论文】01经济学论文数据哪里找?
  20. IE8中文件下载不兼容问题

热门文章

  1. jQuery.ready in CRM Fiori Opportunity Application
  2. ng-repeat part1 - how UI is rendered from {{name}} to actual value
  3. why is the configuration.js being loaded?
  4. SAP Cloud Platform创建Destination时Additional properties属性的维护
  5. html native code is rendered from xml configuration
  6. 一个最简单的WebSocket hello world demo
  7. Postman里如何把某个HTTP的请求和响应作为example保存
  8. One order search的框架代码里,硬编码了要去取Interaction object相关的数据
  9. SAP CRM调查问卷的评分和图表显示功能介绍 1
  10. asp.core api 通过socket和服务器通信发送udp_【网络通信】TCP的通信过程