| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 안드로이드
- 카카오 알고리즘
- Android 12 대응
- 영어공부
- Android Navigation
- 코틀린 코루틴
- Java
- 습관만들기
- 알고리즘 자바
- WebView
- Kotlin FCM
- Android ProgressBar
- android recyclerview
- Android
- 영어독립365
- Android WebView
- 안드로이드 갤러리 접근
- Android Jetpack
- 안드로이드 카카오 로그인
- OkHttp Interceptor
- 프로그래머스 알고리즘
- MVP Architecture
- coroutine
- Android Interceptor
- Android 12
- Kotlin
- 66챌린지
- DataBinding
- Android ViewPager2
- scope function
Archives
- Today
- Total
나미래 Android 개발자
[Android] Spannable Click Event Example 본문
Spannable Click Event Example
개요
Spannable과 ClickableSpan을 이용하여 텍스트 뷰의 특정 문구를 눌렀을 때, 심어둔 링크를 바탕으로 웹페이지를 열도록 한다.
여기서는 "안드로이드 개발을 공부하는 신입 개발자입니다. 궁금하시다면 여기로 오시면 제 블로그를 방문하실 수 있습니다." 문장에서 여기에 블로그 링크를 심어서 동작하도록 해보겠다.
앱 실행 화면

Code
build.gradle(Module): ViewBinding 사용
android {
...
buildFeatures{
viewBinding = true
}
...
}
activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="안드로이드 개발을 공부하는 신입 개발자입니다. 궁금하시다면 여기로 오시면 제 블로그를 방문하실 수 있습니다."
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt
import android.content.Intent
import android.graphics.Typeface
import android.net.Uri
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.Spannable
import android.text.TextPaint
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.text.style.StyleSpan
import android.view.View
import androidx.core.text.toSpannable
import com.example.testspannableapplication.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val text = binding.textView.text
val targetStr = "여기"
val startIdx = text.indexOf(targetStr)
val endIdx = startIdx + targetStr.length
// Span에 들어갈 clickableSpan 객체 생성
val mClickableSpan = object: ClickableSpan(){
override fun updateDrawState(textPaint: TextPaint) {
textPaint.color = this@MainActivity.getColor(R.color.blue)
textPaint.isUnderlineText = true
}
override fun onClick(v: View) {
val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.com"))
startActivity(browserIntent)
}
}
val spannable = text.toSpannable().apply{
// 폰트 설정
setSpan(StyleSpan(Typeface.BOLD), startIdx, endIdx, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
// 클릭 이벤트 설정
setSpan(mClickableSpan, startIdx, endIdx, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
binding.textView.apply{
this.text = spannable
this.movementMethod = LinkMovementMethod()
}
}
}
mClickableSpan: ClickableSpan은 추상클래스이기 때문에 추상함수인onClick을 정의한 객체를 만들어 사용해야한다.onClick(v: View):targetStr을 클릭했을 때, 동작될 기능을 구현한다.updateDrawState(textPaint: TextPaint):targetStr에 추가할 스타일을 정의한다.
spannable:text를 spannable 타입으로 변경하여 추가할 span들을 설정한 값(Spannable)을 저장한다.this.movementMethod = LinkeMovementMethod(): TextView에 클릭 이벤트가 허용될 수 있도록 설정한다.
질문과 잘못된 점에 대해 말씀해주시는 건 언제나 환영입니다.
zero5.two4@gmail.com
'안드로이드 > View' 카테고리의 다른 글
| [Android] WebView의 JS 함수 호출 (0) | 2022.11.22 |
|---|---|
| [Android] WebView Bridge Basic Sample (1) | 2022.09.30 |
| [Android] RecyclerView 아이템 여백 설정 (1) | 2022.09.24 |
| [Android] RecyclerView Multi-ViewHolder Basic Sample: 채팅 화면 (0) | 2022.08.30 |
| [Android] ViewPager2 Basic Sample in Kotlin (0) | 2022.08.10 |
Comments