如何处理穿戴撰写中的长按事件?

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

我用的是Wear Compose 1.2.1版本,可以用Modifier.combinedClickable()处理onLongClick事件,但是Wear Compose 1.3.x版本之后就不能处理长按事件了。

我认为功能已更改,但我不知道如何修改我的代码。

有谁知道怎么做吗?

我的代码如下:

        Button(
            modifier = Modifier
                .height(48.dp)
                .width(48.dp)
                .padding(2.dp)
                .background(color = Color.Black)
                .combinedClickable(
                    interactionSource = remember {
                        MutableInteractionSource()
                    },
                    indication = null,
                    enabled = true,
                    onClick = {
                        Toast.makeText(
                            context,
                            context.getString(R.string.long_press_to_stop),
                            Toast.LENGTH_SHORT
                        ).show()
                    },
                    onLongClick = {
                        Log.v("STOP", "onLongClick")
                        // --- stop action ---
                    },
                ),
            onClick = { },
            colors = ButtonDefaults.primaryButtonColors(backgroundColor =  Color.Black),
            enabled = true
        ) {
            Icon(
                painter = painterResource(id = R.drawable.baseline_stop_24),
                contentDescription = "Stop",
                tint = Color.LightGray
            )
        }

我的 build.gradle.kts 的依赖部分,只需更改版本号,然后更改行为。

    //val wearComposeVersion = "1.2.1"           // works OK
    val wearComposeVersion = "1.3.0"             // does not handle long click event
    implementation("androidx.wear.compose:compose-material:$wearComposeVersion")
    implementation("androidx.wear.compose:compose-foundation:$wearComposeVersion")
    implementation("androidx.wear.compose:compose-navigation:$wearComposeVersion")
android wear-os
1个回答
0
投票

解决方案

简而言之:

  1. 添加
    Box
    作为
    Button
    的根内容。
  2. combinedClickable
    修饰符添加到
    Box
    ,使用
    onLongClick
  3. clearAndSetSemantics
    来自
    Button
    Button(
        onClick = onClick,
        modifier = modifier
            .size(buttonSize.tapTargetSize)
            .clearAndSetSemantics {
                role = Role.Button
                this.contentDescription = contentDescription
                if (!enabled) {
                    disabled()
                }
            },
        enabled = enabled,
        colors = colors,
        interactionSource = interactionSource,
    ) {
        Box(
            modifier = Modifier
                .fillMaxSize()
                .clip(CircleShape)
                .combinedClickable(
                    interactionSource = interactionSource,
                    indication = null, // From material Button
                    enabled = enabled,
                    onClick = onClick,
                    onLongClick = onLongClick,
                    onDoubleClick = onDoubleClick,
                    role = Role.Button,
                ),
        ) {
            // your content here
        }
    }

您可以在这个拉取请求中看到它是如何完成的

替代解决方案

使用 Horographer Compose Material 库中的 Button 组件。

依赖性:

implementation "com.google.android.horologist:horologist-compose-material:<version>"

进口:

import com.google.android.horologist.compose.material.Button

用途:

Button(
    id = R.drawable.baseline_stop_24,
    contentDescription = "Stop",
    onClick = { /* your code */ },
    onLongClick = { /* your code */ },
)

背景

Wear Compose 版本 1.3.x 不处理长按事件。

是的,根据 Wear Compose 团队成员的发现

现在不可能在组件外部添加另一个可点击的组件(例如,从外部扩展 Chip 或 Button 并添加其他回调,如 LongClick) - 为此,我们必须重写组件本身(通过使用组合的 Clickable 或其他修饰符)。

请注意,上述解决方案是针对

Button
组件量身定制的。对于具有内部填充的其他组件,例如
Chip
Card
,根据此 comment,还有更多步骤。

© www.soinside.com 2019 - 2024. All rights reserved.