Android Compose 实现可点击的超链接文本

Android Compose实现一段可点击的超链接文本,Compose的实现方式与在Activity或Fragment中的实现方式是有所不同的,因此记录一下Android Compose实现可点击的超链接文本。代码如下:
首先定义一段字符串数组:

<!-- 可供多语言 -->
<string-array name="arrays">
        <item>Agree to the&#160;</item> <!-- &#160; 是一个英文半角空格占位符 -->
        <item>User Agreements</item>
        <item>&#160;and the&#160;</item>
        <item>Privacy Policy</item>
        <item>. </item>
    </string-array>
@Composable
fun test() {
	val agreements = stringArrayResource(id = R.array.arrays)
	val color = Color.Blue // 超链接颜色
	val annotatedString = buildAnnotatedString {
    	for(str in agreements) {
        	when(str) {
            	"User Agreements"-> {
                 	pushStringAnnotation(tag="agreement", annotation = "https://abc")
                    withStyle(style = SpanStyle(color = color, fontWeight = FontWeight.Bold)){
                    	append(str)
                    }
                    pop() // 使用Push之后,需要pop,否则点击时tag标签获取不到
            	}
            	"Privacy Policy" -> {
            		pushStringAnnotation(tag="privacy", annotation = "https://def")
            		// 设置
                    withStyle(style = SpanStyle(color = color, fontWeight = FontWeight.Bold)){
                    	append(str)
                    }
                    pop()
                }
               	else -> append(str)
            }
         }
	}
	val style = LocalTextStyle.current.copy(textIndent = TextIndent(firstLine = 24.sp)) // textIndent是首行缩进24.sp
	ClickableText(text = annotatedString, modifier = Modifier
		.padding(top = 8.dp)
        .alpha(0.65f), style = style, onClick = { offset ->
        // 获取标签
        annotatedString.getStringAnnotations(tag = "privacy", start = offset, end = offset).firstOrNull()?.let {
        	val title = annotatedString.text.subSequence(it.start, it.end)
        	val url = it.item
        	Log.i(TAG, "test-->: $offset  $title  $url")
        	// 可以实现其它逻辑
        }
        annotatedString.getStringAnnotations(tag = "agreement", start = offset, end = offset).firstOrNull()?.let {
        	val title = annotatedString.text.subSequence(it.start, it.end)
            val url = it.item
            Log.i(TAG, "test-->: $offset  $title  $url")
            // 可以实现其它逻辑
        }
   })
}

注:strings.xmls中需使用的各种空格占位符

&#32;(普通的英文半角空格)
&#160;(普通的英文半角空格但不换行)
&#12288;(中文全角空格,就是一个中文宽度)
&#8194;(半个中文宽度)
&#8195;(一个中文宽度)
&#8197;(四分之一中文宽度)
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值