Skip to content

常见问题

petterp edited this page Aug 30, 2026 · 1 revision

常见问题

接入时最常踩到的几个问题:系统浮窗权限、低版本 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.contentDecorView 时拖动范围才是真正的「全屏」,不受状态栏 / 导航栏 / AppBar 影响。 需要限制在应用视图范围内时用 appHost(app) { attachTo(AppAttachTarget.CONTENT) }。见 App 级全局浮窗


返回 Home · 相关:系统级浮窗 局部浮窗 Compose 浮窗 Issue 覆盖矩阵

Clone this wiki locally