일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JetpackCompose
- Firebase
- 안드로이드컴포즈
- 안드로이드 라이브러리
- 애드몹광고
- dynamiclink
- Android 애드몹
- android daum map
- 젯팩컴포즈
- 컴포넌트
- android kakao map
- 안드로이드
- thread
- 아키텍처
- ImageView
- 클린 아키텍처
- 애드몹배너
- Clean Architecture
- 파이어베이스
- 안드로이드광고
- 선언형UI
- RecyclerView
- Android
- glide
- 안드로이드 카카오 지도
- HTTP
- 동적 링크
- 다이나믹 링크
- android 지도
- component
- Today
- Total
코딩스토리
[Android] Spannable를 사용해 특정 문자에 이벤트 적용하자 본문
Spannable는 텍스트의 일부를 바꿀 수 있게 해줍니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_sample"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="안녕하세요 라크라꾸입니다."
android:bufferType="spannable"
android:textSize="30dp"/>
</LinearLayout>
Spannable를 사용하기 위해서는 BufferType속성을 Spannable로 지정해주어야 합니다.
import android.content.Context;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Spannable;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Context mContext;
private TextView tv_sample;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = getApplicationContext();
tv_sample = (TextView) findViewById(R.id.tv_sample);
Spannable span = (Spannable) tv_sample.getText();
span.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
}
}
지금부터 만지는 코드는 아래 코드만 수정해주시면 됩니다.
ForegroundColorSpan
- 글자 색 지정
Spannable span = (Spannable) tv_sample.getText();
span.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
0번째 인덱스~ 5번째 인덱스의 문자(안녕하세요)부분만 빨간색을 입힌 예제입니다.
BackgroundColorSpan
- 배경 색 지정
Spannable span = (Spannable) tv_sample.getText();
span.setSpan(new ForegroundColorSpan(Color.WHITE), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new BackgroundColorSpan(Color.RED), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
0번째 인덱스~ 5번째 인덱스의 문자(안녕하세요)부분만 빨간색을 입힌 예제입니다.
AbsoluteSizeSpan
- 글자크기 고정
Spannable span = (Spannable) tv_sample.getText();
span.setSpan(new ForegroundColorSpan(Color.WHITE), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new BackgroundColorSpan(Color.RED), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new AbsoluteSizeSpan(100), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
0번째 인덱스~ 5번째 인덱스의 문자(안녕하세요)부분만 글자 크기를 100으로 지정했습니다.
주변의 글자와 관계없이 크기가 100으로 고정되어있습니다.
RelativeSizeSpan
- 주변 글자 크기에 따라 크기 변경
Spannable span = (Spannable) tv_sample.getText();
span.setSpan(new ForegroundColorSpan(Color.WHITE), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new BackgroundColorSpan(Color.RED), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new RelativeSizeSpan(1.5f), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
0번째 인덱스~ 5번째 인덱스의 문자(안녕하세요)부분만 글자 크기를 주변 글자크기의 1.5배로 지정했습니다.
주변의 글자의 크기에 따라 "안녕하세요"문자의 크기도 변경됩니다.
UnderlineSpan
- 밑줄 표시
Spannable span = (Spannable) tv_sample.getText();
span.setSpan(new ForegroundColorSpan(Color.WHITE), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new BackgroundColorSpan(Color.RED), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new RelativeSizeSpan(1.5f), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new UnderlineSpan(), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
0번째 인덱스~ 5번째 인덱스의 문자(안녕하세요)부분만 밑줄을 적용했습니다.
ImageSpan
- 글자 사이 이미지 적용
Drawable image = getResources().getDrawable(R.drawable.best);
image.setBounds(0, 0, image.getIntrinsicWidth(), image.getIntrinsicHeight());
Spannable span = (Spannable) tv_sample.getText();
span.setSpan(new ImageSpan(image), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
0~5번째 인덱스에 넣고 싶은 이미지로 대체할 수 있습니다.
StyleSpan
- 글자 스타일 지정
Spannable span = (Spannable) tv_sample.getText();
span.setSpan(new ForegroundColorSpan(Color.WHITE), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new BackgroundColorSpan(Color.RED), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new RelativeSizeSpan(1.5f), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new UnderlineSpan(), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
span.setSpan(new StyleSpan(Typeface.BOLD), 0, 5, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
0번째 인덱스~ 5번째 인덱스의 문자(안녕하세요)부분만 Bold글씨체를 적용했습니다.
URLSpan
- URL링크 바로가기
Spannable span = (Spannable) tv_sample.getText();
String url = "https://lakue.tistory.com/4";
span.setSpan(new URLSpan(url), 6, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv_sample.setMovementMethod(LinkMovementMethod.getInstance());
6~10번째 인덱스(라크라꾸)를 클릭하게 되면 해당 URL로 이동하게 적용하였습니다.
ClickableSpan
- 클릭 효과 지정
Spannable span = (Spannable) tv_sample.getText();
tv_sample.setMovementMethod(LinkMovementMethod.getInstance());
span.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(mContext, "라크라꾸~~", Toast.LENGTH_SHORT).show();
}
}, 6, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv_sample.setMovementMethod(LinkMovementMethod.getInstance());
6~10번째 인덱스(라크라꾸)를 클릭하게 되면 Toast메시지가 뜨도록 적용하였습니다.
'Android > 유용한 기술' 카테고리의 다른 글
[Android/안드로이드] 페이스북로그인 버튼 커스텀/Facebook Login Button Custom (0) | 2019.12.18 |
---|---|
[Android/안드로이드] 페이스북 로그인 / Facebook Login 연동 (23) | 2019.12.17 |
[Android/안드로이드] 해시키(Hash key) 가져오는 방법 (330) | 2019.12.16 |
[Android] 유용한 라이브러리 - Glide를 사용해 쉽게 Image로드하자!! (354) | 2019.12.11 |
[Android]유용한 라이브러리 - Butter Knife사용법 (4) | 2019.12.11 |