android - 适用于 Android 的 AutoLink 撰写文本
问题描述
有没有办法在 JetPack Compose Text 上使用android:autoLink功能?
我知道,在一个简单的标签/修饰符中使用此功能可能不是“声明性方式”,但也许有一些简单的方法?
对于样式文本,我可以使用这种方式
val apiString = AnnotatedString.Builder("API provided by")
apiString.pushStyle(
style = SpanStyle(
color = Color.Companion.Blue,
textDecoration = TextDecoration.Underline
)
)
apiString.append("https://example.com")
Text(text = apiString.toAnnotatedString())
但是,我如何在此处管理点击次数?如果我以编程方式说出我对系统的期望行为(电子邮件、电话、网络等),那就太好了。喜欢它。与 TextView 一起使用。谢谢
解决方案
我们可以像下面这个例子一样在 Android Compose中实现Linkify,TextView
@Composable
fun LinkifySample() {
val uriHandler = UriHandlerAmbient.current
val layoutResult = remember {
mutableStateOf<TextLayoutResult?>(null)
}
val text = "API provided by"
val annotatedString = annotatedString {
pushStyle(
style = SpanStyle(
color = Color.Companion.Blue,
textDecoration = TextDecoration.Underline
)
)
append(text)
addStringAnnotation(
tag = "URL",
annotation = "https://example.com",
start = 0,
end = text.length
)
}
Text(
fontSize = 16.sp,
text = annotatedString, modifier = Modifier.tapGestureFilter { offsetPosition ->
layoutResult.value?.let {
val position = it.getOffsetForPosition(offsetPosition)
annotatedString.getStringAnnotations(position, position).firstOrNull()
?.let { result ->
if (result.tag == "URL") {
uriHandler.openUri(result.item)
}
}
}
},
onTextLayout = { layoutResult.value = it }
)
}
在上面的例子中,我们可以看到我们给出了文本,也可以addStringAnnotation
用来设置标签。使用 tapGestureFilter
,我们可以得到点击的注解。
最后使用UriHandlerAmbient.current
我们可以打开电子邮件、电话或网络等链接。
参考:https ://www.hellsoft.se/rendering-markdown-with-jetpack-compose/
推荐阅读
- java - Android App 中的全局视图和本地视图
- javascript - 多级导入/导出
- swift - 如何在 iOS swift 中使用 UDP 套接字流式传输音频?
- c - 字符串文字的静态持续时间
- android - Android安装后会自动删除obb扩展文件吗?
- java - 重新声明抽象方法公开的规则?
- postgresql - 使用 pg_dump 导出 postgres db 不起作用,数据库“db_name”不存在
- ibm-watson - IBM Watson Dialog 节点响应未到来
- javascript - 如何将项目推送到 Vuejs 中数据对象的数组中?Vue 似乎没有关注 .push() 方法
- c# - 将内部版本号应用于程序集的 VSTS 问题