Jetpack Compose中为LazyColumn内Card添加长按事件失败求助
Jetpack Compose Card添加长按事件的解决方案
我在LazyColumn中使用Card组件,已通过clickable修饰符实现单击跳转功能,但尝试添加长按事件时使用.longclick{}提示「未解析的引用」,已导入androidx.compose.foundation.gestures.*,求解决方法。
原代码:
Card(colors = CardDefaults.cardColors( containerColor = Color(0xFF7DCEA0), Color.Black ), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), modifier = Modifier .padding(horizontal = 6.dp, vertical = 6.dp) .offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) } .clickable { mContext.startActivity(Intent(mContext, DCInfo::class.java)) } .border(1.dp, SolidColor(Color(0xFF1C536F)), shape = RoundedCornerShape(15.dp)) .fillMaxWidth(), shape = RoundedCornerShape(CornerSize(15.dp)) )
方案一:使用combinedClickable修饰符(推荐)
Compose中没有单独的.longclick{}修饰符,要同时处理单击和长按,推荐替换clickable为combinedClickable,它支持同时配置单击、长按等事件:
修改后的代码:
Card(colors = CardDefaults.cardColors( containerColor = Color(0xFF7DCEA0), Color.Black ), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), modifier = Modifier .padding(horizontal = 6.dp, vertical = 6.dp) .offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) } // 替换clickable为combinedClickable .combinedClickable( onClick = { mContext.startActivity(Intent(mContext, DCInfo::class.java)) }, onLongClick = { // 这里添加长按事件的逻辑 // 示例:Toast.makeText(mContext, "长按触发", Toast.LENGTH_SHORT).show() } ) .border(1.dp, SolidColor(Color(0xFF1C536F)), shape = RoundedCornerShape(15.dp)) .fillMaxWidth(), shape = RoundedCornerShape(CornerSize(15.dp)) )
若IDE未自动导入,需手动添加包:import androidx.compose.foundation.clickable.combinedClickable。
方案二:使用pointerInput处理长按事件
如果需要保留原有的clickable,也可以通过pointerInput单独添加长按逻辑:
Card(colors = CardDefaults.cardColors( containerColor = Color(0xFF7DCEA0), Color.Black ), elevation = CardDefaults.cardElevation(defaultElevation = 2.dp), modifier = Modifier .padding(horizontal = 6.dp, vertical = 6.dp) .offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) } .clickable { mContext.startActivity(Intent(mContext, DCInfo::class.java)) } .pointerInput(Unit) { detectTapGestures( onLongPress = { // 长按事件逻辑 } ) } .border(1.dp, SolidColor(Color(0xFF1C536F)), shape = RoundedCornerShape(15.dp)) .fillMaxWidth(), shape = RoundedCornerShape(CornerSize(15.dp)) )
此方式需导入包:import androidx.compose.foundation.gestures.detectTapGestures,但相比方案一,combinedClickable更简洁统一,优先推荐。
内容的提问来源于stack exchange,提问作者VFarkas2023
相关产品推荐
相关产品推荐

