代码之家  ›  专栏  ›  技术社区  ›  kkkkk

Jetpack Compose Android按钮检测长点击

  •  0
  • kkkkk  · 技术社区  · 3 年前

    如何检测长点击

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

    这不起作用。onClick是必需的,我想它会消耗combinedClickable。我还需要一个互动源。 我宁愿避免创建自定义按钮。

    2 回复  |  直到 3 年前
        1
  •  7
  •   Thracian    2 年前

    它不起作用 Button 因为同样的原因,你不能连锁 Modifier.clickable{}.clickable{}

    具有 按钮 添加另一个 Modifier.pointerInput() 不会有任何效果,因为 按钮 Surface 带有分配的onClick参数 Modifier.clickable() 已经 Modifier.clickable 已经消耗了事件,并且不让其他 修饰符.pointerInput() 接收它。

    在Jetpack中,当有两个或多个时组合 修饰符.pointerInput() 链接在一起底部的一个默认情况下首先接收事件 通过 哪个是 PointeEventPass.Main 。因为,可点击已经消耗了,所以你分配的人永远不会得到它。

    最简单的方法是使用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")
        }
    }
    
        2
  •  -1
  •   zaid khan    3 年前

    你可以试试这个

     modifier = Modifier
               .weight(2f)
               .pointerInput(Unit){
                   detectTapGestures(
                         onLongPress = {
                                 // perform some action here..
                         }
                   )
                }