You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jetpack Compose中为悬浮操作按钮添加长按事件?

解决Compose FloatingActionButton的单击+长按事件问题

你的问题出在FloatingActionButton自带的onClick参数会覆盖Modifier里的combinedClickable事件——FAB内部已经通过clickable修饰符实现了点击逻辑,会拦截触摸事件,导致你写的combinedClickable完全触发不了。

下面给两种可行的解决方案:

方案一:移除FAB自带的onClick,使用combinedClickable

直接删掉FloatingActionButton的onClick参数,只保留Modifier上的combinedClickable即可,这样两个事件都能正常触发:

@Composable
@ExperimentalFoundationApi
fun MyFAB() {
    FloatingActionButton(
        modifier = Modifier
            .combinedClickable(
                onLongClick = {
                    Log.d(TAG, "onLongClick") // 现在能正常工作
                },
                onClick = {
                    Log.d(TAG, "onClick") // 现在能正常工作
                }
            )
    ) {
        Icon(
            imageVector = Icons.Default.Add,
            contentDescription = "Add item"
        )
    }
}

注意:combinedClickable目前属于实验性API,需要添加@ExperimentalFoundationApi注解,或者在gradle中配置相关实验性开关。

方案二:使用pointerInput实现(非实验性API)

如果不想依赖实验性API,可以用pointerInput手动处理触摸事件,通过手势检测器区分长按和单击:

@Composable
fun MyFAB() {
    FloatingActionButton(
        onClick = {} // 必须传空实现,否则FAB会默认拦截事件
    ) {
        Icon(
            imageVector = Icons.Default.Add,
            contentDescription = "Add item",
            modifier = Modifier
                .pointerInput(Unit) {
                    detectTapGestures(
                        onLongPress = {
                            Log.d(TAG, "onLongClick")
                        },
                        onTap = {
                            Log.d(TAG, "onClick")
                        }
                    )
                }
        )
    }
}

这里要注意:FloatingActionButton的onClick不能省略,必须传一个空实现,否则它依然会拦截事件,导致内部Icon的pointerInput接收不到触摸信号。

内容的提问来源于stack exchange,提问作者Always Learner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 17:25:03