Android撰写文本的自动链接

Android撰写文本的自动链接,android,textview,android-jetpack-compose,Android,Textview,Android Jetpack Compose,有没有办法在JetPack撰写文本时使用android:autoLink功能 我知道,在一个简单的标记/修改器中使用这个特性可能不是“声明性的方式”,但也许有一些简单的方式可以做到这一点 对于文本样式,我可以使用这种方式 val apiString = AnnotatedString.Builder("API provided by") apiString.pushStyle( style = SpanStyle(

有没有办法在JetPack撰写文本时使用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())
但是,我如何管理这里的点击?如果我能通过编程说出我对系统的期望行为(电子邮件、电话、网络等),那就太好了。喜欢。使用文本视图。 谢谢你

我们可以在Android Compose中实现类似以下示例的
文本视图

@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 }
    )
}
@Composable
有趣的例子(){
val uriHandler=UriHandlerAmbient.current
val layoutResult=记住{
可变状态(null)
}
val text=“API提供人”
val annotatedString=annotatedString{
推式(
style=SpanStyle(
颜色=color.Companion.Blue,
text装饰=text装饰。下划线
)
)
附加(文本)
addStringAnnotation(
tag=“URL”,
注释=”https://example.com",
开始=0,
end=text.length
)
}
正文(
fontSize=16.sp,
text=annotatedString,modifier=modifier.tapGestureFilter{offsetPosition->
layoutResult.value?让我们{
val position=it.getOffsetForPosition(偏移位置)
annotatedString.getStringAnnotations(位置,位置).firstOrNull()
?.让{结果->
如果(result.tag==“URL”){
openUri(result.item)
}
}
}
},
onTextLayout={layoutResult.value=it}
)
}
在上面的示例中,我们可以看到我们给出了文本,并且我们使用
addStringAnnotation
来设置标记。使用
tappesturefilter
,我们可以获得单击的注释

最后,使用
UriHandlerAmbient.current
我们可以打开电子邮件、电话或web等链接


参考资料:

感谢您的解决方案,它与URL配合使用效果很好。但它不适用于电子邮件和电话。但对于这些情况,我们可以使用deepLink,如mailto:example@email.com所以,是的!谢谢!:)这里有更多最新的解决方案