ViewCompat.setOnApplyWindowInsetsListener绑定Activity根视图无响应问题及Insetter库适配求助
问题:Activity根视图无法接收WindowInsets,DecorView却正常响应
最近在处理系统Insets的时候踩了个坑,快给我整懵了:我尝试给Activity的根视图(main_root)设置ViewCompat.setOnApplyWindowInsetsListener,但这个监听器完全没被触发。可奇怪的是,把同一个监听器绑到window.decorView上就一切正常,Toast能正常弹出来。
正常工作的DecorView监听器代码:
ViewCompat.setOnApplyWindowInsetsListener(window.decorView){ v, insets -> Toast.makeText(this, "INSETS HANDLED", Toast.LENGTH_LONG).show() insets }
完全没反应的根视图监听器代码:
ViewCompat.setOnApplyWindowInsetsListener(main_root) { v, insets -> Toast.makeText(this, "INSETS HANDLED", Toast.LENGTH_LONG).show() insets }
我的应用是单Activity架构,这两个监听器都是在onCreate()方法里设置的。我知道可以通过DecorView的方式获取Insets然后缓存,但现在必须让根视图的写法生效——因为我要用Insetter库,它的API是直接给目标视图绑定Insets处理逻辑的:
Insetter.builder() .applySystemWindowInsetsToPadding(Side.LEFT) .applyToView(main_bottom_nav)
我调试后发现这个库底层就是用类似根视图的方式设置监听器,所以只要解决根视图监听器不触发的问题,这个库就能正常工作了。
我的困惑
我实在想不通为什么会这样:DecorView能接收到Insets,Activity的根视图却不行。按逻辑推断,只有当DecorView和根视图之间有某个组件处理并消费了Insets才会出现这种情况,但这完全不符合常理啊——Activity根视图理应能感知到Insets才对。
已尝试的无效解决方案
我试了好几种办法,结果都没用:
- 将根ViewGroup从ConstraintLayout切换为FrameLayout/LinearLayout/RelativeLayout;
- 为Activity根ViewGroup添加/移除
fitsSystemWindows属性(因为我要做全屏应用,本来就打算禁用这个标志); - 修改Activity的
windowSoftInputMode(当前设置的是adjustResize); - 在设置监听器前后给目标视图调用
requestApplyInsets(); - 降级
androidx.core:core-ktx和androidx.activity:activity-ktx到稳定版本。
相关代码来自我项目中的activity_main.xml布局文件和MainActivity.kt文件。
内容的提问来源于stack exchange,提问作者KirstenLy
相关产品推荐
相关产品推荐

