Android jetpack 中的按钮长按监听器组合 [英] Button Long Press Listener in Android jetpack compose
问题描述
我有一个带有按钮的 Android 可组合用户界面.
如何跟踪按钮长按事件?我让它为文本"工作长按,但对于 Button,它不起作用.如果我对按钮应用修饰符,则与下面相同,它不起作用.
I am having an Android Composable UI with a Button.
How can I track Button Long Press events? I got it working for the "Text" Long press, but for Button, It is not working. Same way like below if I apply a modifier to the button, it is not working.
Text(
text = view.text,
fontSize = view.textFontSize.toInt().sp,
fontWeight = FontWeight(view.textFontWeight.toInt()),
color = Color(android.graphics.Color.parseColor(view.textColor)),
modifier = Modifier.clickable(
onClick = {
println("Single Click")
},
onLongClick = {
println("Long Click")
},
onDoubleClick = {
println("Double Tap")
},
),
)
推荐答案
处理此问题的最佳方法是滚动您自己的 Button
.Material Button
基本上只是一个 Surface
和一个 Row
.添加您自己的 Modifier.clickable
不起作用的原因是因为已经设置了.
The best way to handle this is to roll your own Button
. The Material Button
is basically just a Surface
and a Row
. The reason adding your own Modifier.clickable
doesn't work is because one is already set.
因此,如果您想添加 onLongPress
等,您可以复制/粘贴默认实现并传入这些 lambda.
So, if you'd like to add onLongPress
, etc you can copy/paste the default implementation and pass those lambdas in.
@Composable
@OptIn(ExperimentalMaterialApi::class, ExperimentalFoundationApi::class)
fun Button(
onClick: () -> Unit,
modifier: Modifier = Modifier,
onLongClick: (() -> Unit)? = null,
onDoubleClick: (() -> Unit)? = null,
enabled: Boolean = true,
interactionState: InteractionState = remember { InteractionState() },
elevation: ButtonElevation? = ButtonDefaults.elevation(),
shape: Shape = MaterialTheme.shapes.small,
border: BorderStroke? = null,
colors: ButtonColors = ButtonDefaults.buttonColors(),
contentPadding: PaddingValues = ButtonDefaults.ContentPadding,
content: @Composable RowScope.() -> Unit
) {
val contentColor by colors.contentColor(enabled)
Surface(
shape = shape,
color = colors.backgroundColor(enabled).value,
contentColor = contentColor.copy(alpha = 1f),
border = border,
elevation = elevation?.elevation(enabled, interactionState)?.value ?: 0.dp,
modifier = modifier.combinedClickable(
onClick = onClick,
onDoubleClick = onDoubleClick,
onLongClick = onLongClick,
enabled = enabled,
role = Role.Button,
interactionState = interactionState,
indication = null
)
) {
Providers(LocalContentAlpha provides contentColor.alpha) {
ProvideTextStyle(
value = MaterialTheme.typography.button
) {
Row(
Modifier
.defaultMinSizeConstraints(
minWidth = ButtonDefaults.MinWidth,
minHeight = ButtonDefaults.MinHeight
)
.indication(interactionState, rememberRipple())
.padding(contentPadding),
horizontalArrangement = Arrangement.Center,
verticalAlignment = Alignment.CenterVertically,
content = content
)
}
}
}
}
用法:
Button(
onClick = {},
onLongClick = {},
onDoubleClick = {}
) {
Text(text = "I'm a button")
}
这篇关于Android jetpack 中的按钮长按监听器组合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!