android getwindow 在fragment不能使用,Android Fragment 布局使用 fitsSystemWindows = true 无效解决方案...
最近遇到一个奇葩问题,导航栏多个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 无效解决方案...相关推荐
- android 弹出fragment,Android中ViewPager获取当前显示的Fragment
前言 在项目中,有时会用到在ViewPager中显示同样类型的Fragment,同时这样的Fragment的个数是动态的,但是PagerAdapter没有给我们提供getCurrentFragment ...
- Android典型界面设计(4)——使用ActionBar+Fragment实现tab切换
一.问题描述 之前我们使用ViewPager+Fragment区域内头部导航,在Android 3.0之后Google增加了新的ActionBar,可方便的实现屏幕Head部区域的 设计如返回键.标题 ...
- 【译】用Fragment创建动态的界面布局(附Android示例代码)
原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ...
- Android系列之Fragment(二)----Fragment的生命周期和返回栈
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- android fragment动态添加,Android动态添加Fragment
效果图如下: 项目结构图如下: Fragment1: package com.demo.dongtaifragment; import android.app.Fragment; import and ...
- 【Android基础】Fragment 详解之Fragment介绍
Fragment在Android 3.0( API 11)引入,是为了支持在大屏上显示更加动态.灵活的UI,比如在平板和电视上.Fragment可以看作是嵌套的Activity,类似ActivityG ...
- android fragment 底部菜单栏,一句话搞定Android底部导航栏,一键绑定Fragment、ViewPager...
现在大多数App都会用到底部导航栏,比如常见的聊天工具QQ.微信.购物App等等,有了底部导航栏,用户可以随时切换界面,查看不同的内容.它的实现方式也很多,以前大多使用TabHost来实现,但是现在我 ...
- android fragment framelayout,framelayout中fragment的切换
我们在android开发中经常会用到fragment,例如侧拉栏的切换,viewPager的切换. 而我们切换fragment无非就两种方法: 1.replace(): 2.add(),hide(), ...
最新文章
- Android如何使用读写cookie的方法
- 三相全桥电压型PWM逆变器(交直交)Simulink仿真
- boost::log::sinks::debug_output_backend用法的测试程序
- 移除集合效率高还是add高_效率比较--集合
- python的闭包要素_Python的闭包
- centos7安装kubernetes1.9集群
- c语言能返回字符串吗,C语言中函数返回字符串的四种方法
- 杂谈(23)也说高考
- Qt SQL 学习笔记二:qt建立数据库,创建和操纵表
- dsp的ad标志位是什么_DSP简简单单学习之AD采样
- 利用lavarel框架实现Todos App
- 洛谷:P5520 [yLOI2019] 青原樱(数学,普及/提高-)
- Android高级开发进阶图谱
- 红孩儿编辑器的模块设计16
- 菜鸟Java开发人员的找工作之旅(1)
- DHT11大气温湿度模块+直流电机实现根据温度控制风扇转动
- MATLAB---形态学滤波
- 父类(指针、引用)指向子类对象
- 【毕业论文】01经济学论文数据哪里找?
- IE8中文件下载不兼容问题
热门文章
- jQuery.ready in CRM Fiori Opportunity Application
- ng-repeat part1 - how UI is rendered from {{name}} to actual value
- why is the configuration.js being loaded?
- SAP Cloud Platform创建Destination时Additional properties属性的维护
- html native code is rendered from xml configuration
- 一个最简单的WebSocket hello world demo
- Postman里如何把某个HTTP的请求和响应作为example保存
- One order search的框架代码里,硬编码了要去取Interaction object相关的数据
- SAP CRM调查问卷的评分和图表显示功能介绍 1
- asp.core api 通过socket和服务器通信发送udp_【网络通信】TCP的通信过程