调用Snackbar.make仅MIUI12设备报No suitable parent found异常
问题根因
该报错是因为调用Snackbar.make()时传入的目标View已经与Window解绑,Snackbar无法找到可依附的父布局。仅在MIUI 12(Android 10)小米设备复现的原因是该版本MIUI对Activity返回时的Fragment生命周期调度、后台资源回收逻辑做了定制化修改,和原生Android及其他厂商ROM行为存在差异:当你从跳转的Activity回退到当前Fragment的瞬间,有概率出现Fragment绑定的根布局已经脱离Window的情况。
修复方案
- 增加前置校验再调用Snackbar
调用前先校验Fragment是否仍处于挂载状态、根布局是否已绑定Window,异常状态下直接跳过弹窗即可:if (isAdded() && MainFragment.this.binding != null && MainFragment.this.binding.getRoot().isAttachedToWindow()) { Snackbar.make(MainFragment.this.binding.getRoot(), data.getStringExtra("nextEvent"), Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } - 兜底使用Activity根布局
不想丢失弹窗的话,可以直接用当前Activity的内容根布局作为Snackbar的依附载体,不受Fragment生命周期影响:View parentView = requireActivity().findViewById(android.R.id.content); Snackbar.make(parentView, data.getStringExtra("nextEvent"), Snackbar.LENGTH_LONG) .setAction("Action", null).show(); - 兼容版本适配
你的项目target SDK为26,该版本适配下MIUI的自定义行为触发概率更高,如有条件可将target SDK升级至30及以上,MIUI对高target SDK应用的生命周期调度会更贴近原生逻辑,可降低此类兼容问题出现概率。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

