Jetpack Compose Android 按钮检测长按

问题描述 投票:0回答:2

如何检测长按

    Button(
    onClick = onClick,
    interactionSource = interactionSource,
    modifier = Modifier
        .combinedClickable(
            onClick = onClick,
            onLongClick = onLongClick
        )
)

这行不通。 onClick 是必需的,我猜它会消耗combinedClickable。我还需要一个交互源。 我宁愿避免创建自定义按钮。

android kotlin button android-jetpack-compose android-jetpack
2个回答
1
投票

它不适用于

Button
,因为与您无法链接的原因相同
Modifier.clickable{}.clickable{}

使用

Button
添加另一个
Modifier.pointerInput()
不会产生任何效果,因为
Button
是一个带有 onClick 参数的
Surface
,并且已经分配了
Modifier.clickable()
Modifier.clickable
已经消耗了事件并且不允许其他
Modifier.pointerInput()
接收它。

在 Jetpack Compose 中,当有两个或多个

Modifier.pointerInput()
链接在一起时,底部的第一个接收事件,默认为 pass,即
PointeEventPass.Main
。因为 clickable 已经消耗了,所以你分配的人永远不会得到它。

最简单的方法是使用 InteractionSource 并将其收集为

@Preview
@Composable
private fun ButtonLongClickSample() {

    val context = LocalContext.current

    val interactionSource = remember { MutableInteractionSource() }

    val viewConfiguration = LocalViewConfiguration.current


    LaunchedEffect(interactionSource) {
        var isLongClick = false

        interactionSource.interactions.collectLatest { interaction ->
            when (interaction) {
                is PressInteraction.Press -> {
                    isLongClick = false
                    delay(viewConfiguration.longPressTimeoutMillis)
                    isLongClick = true
                    Toast.makeText(context, "Long click", Toast.LENGTH_SHORT).show()
                }

                is PressInteraction.Release -> {
                    if (isLongClick.not()) {
                        Toast.makeText(context, "click", Toast.LENGTH_SHORT).show()
                    }

                }

            }
        }
    }


    Button(
        onClick = {},
        interactionSource = interactionSource
    ) {
        Text("Some button")
    }
}

0
投票

你可以试试这个

 modifier = Modifier
           .weight(2f)
           .pointerInput(Unit){
               detectTapGestures(
                     onLongPress = {
                             // perform some action here..
                     }
               )
            }
© www.soinside.com 2019 - 2024. All rights reserved.