-
Notifications
You must be signed in to change notification settings - Fork 188
常见问题
接入时最常踩到的几个问题:系统浮窗权限、低版本 safe area、局部浮窗的调用时机、Dialog 之上的浮窗、 Compose 状态与多进程。
Q:系统浮窗权限被拒了怎么办?
配了 systemHost(app) { fallback(AppHost.builder(app).build()) } 就会自动降级成 App 级浮窗继续显示,
容器换掉但配置、监听器、当前位置都保留(这就是 2.x 的 SYSTEM_AUTO)。没配 fallback 则停在
INSTALLED,之后拿到权限调用 SystemHost.retryPermission() 恢复。三种权限策略见 系统级浮窗。
Q:在后台(或 Service 里)申请权限,什么都没弹出来?
Android 10(Q)起系统禁止后台启动 Activity,auto() 策略的权限申请页可能悄无声息地起不来。
需要在后台安装浮窗时,用 manual {} / skip() 把申请推迟,等应用回到前台再
SystemHost.retryPermission()。见 系统级浮窗。
Q:系统浮窗在 Android 11 以下不避让状态栏 / 刘海?
屏幕级 insets 的公开入口 WindowManager.getCurrentWindowMetrics() 是 API 30(R)才有的,
R 以下 SystemHost 拿不到 safe area,safeArea 对它不起作用(可用区就是整块屏幕)。
需要在低版本避让时,自己用 margin(top = …) 留出来。margin / safeArea 见 配置项。
Q:Activity.fxScope {} 崩了 / 不显示?
它挂在 android.R.id.content 上,必须在 setContentView() 之后调用。局部浮窗的三种宿主见 局部浮窗。
Q:怎么把浮窗显示在 Dialog 之上?
Dialog 有自己的 Window,层级在 Activity 之上,挂在 Activity 上的浮窗盖不住它。
把浮窗直接挂到 Dialog 的 decorView 上(decorView 必须在 dialog.show() 之后取):
dialog.show()
val decor = dialog.window?.decorView as? ViewGroup ?: return
val dialogFx = FloatingX.create("dialog") {
layout(R.layout.fx_card)
anchor(FxGravity.TOP_END)
viewGroupHost(decor)
}
dialogFx.show()
dialog.setOnDismissListener { if (dialogFx.state != FxState.CANCELLED) dialogFx.cancel() }viewGroupHost 来自 floatingx-scope,见 局部浮窗。
Q:compose {} 里的 rememberSaveable 能跨进程恢复吗?
不能。它只在进程内保存:组合被 dispose(容器 detach)时存进浮窗自己的过桥仓库,
重新组合时取回;进程被杀就没了(浮窗本身也不会自动重建)。要跨进程恢复请自己持久化。见 Compose 浮窗。
Q:支持多进程吗?
不支持。FloatingX 注册表按进程隔离,子进程里看到的是另一份空注册表(#129)。见 Issue 覆盖矩阵。
Q:为什么 App 级浮窗默认挂在 DecorView 而不是 R.id.content?
挂 DecorView 时拖动范围才是真正的「全屏」,不受状态栏 / 导航栏 / AppBar 影响。
需要限制在应用视图范围内时用 appHost(app) { attachTo(AppAttachTarget.CONTENT) }。见 App 级全局浮窗。
返回 Home · 相关:系统级浮窗 局部浮窗 Compose 浮窗 Issue 覆盖矩阵