본문 바로가기

Android/View

[Android] 하나의 텍스트 뷰에서 여러가지 스타일 적용하기

package aa.aa;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class aa extends Activity {

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		TextView tv = (TextView) findViewById(R.id.textView01);
		String str = "하나의 텍스트뷰에서 스타일 다르게 적용하기";
		tv.setText(str);

	}
}


일반적으로 위의 코드처름 setText()를 하거나 layout파일에서 text를 지정해 준다면 아래 스샷과같이 같은 색 같은 크기의 텍스트가 출력이 된다. 하지만 때로는 하나의 스트링이지만 다른 스타일을 적용하고 싶을때가 있다. 이런 사람들을 위한 클래스가
SpannableStringBuilder
이다.





먼저 글자의 크기를 변경해보자.
		TextView tv = (TextView) findViewById(R.id.textView01);
		String str = "하나의 텍스트뷰에서 스타일 다르게 적용하기";

		final SpannableStringBuilder sps = new SpannableStringBuilder(str);
		sps.setSpan(new AbsoluteSizeSpan(30), 4, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		
		tv.append(sps);


sps.setSpan(new AbsoluteSizeSpan(30), 4, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

SpannableStringBuilder의 setSpan()메소드를 사용하여 스타일을 변경한다.

setSpan(Object what, int start, int end, int flags) Mark the specified range of text with the specified object.

첫번째 파라미터는 어떤 스타일을 적용할지, 두번째는 바꿀 문자열의 시작, 세번째는 문자열의 마지막, 네번째는 플래그이다. 하지만 플래그는 어떤걸 주더라도 같은 스타일인듯... 이 부분에 스터디는 아직 부족하다. 위의 코드를 적용하여 어플을 실행시키면

위와같이 크기가 변경된것을 확인 할 수 있다. 이번에는 색상을 변경시켜본다.
android.text.style

위의 패키지안에는 텍스트의 스타일을 변경 시킬 수 있는 여러가지의 클래스가 존재한다. 그중에서 색상을 변경할 수 있는 클래스는 ForegroundColorSpan이다.
public class aa extends Activity {

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		TextView tv = (TextView) findViewById(R.id.textView01);
		String str = "하나의 텍스트뷰에서 스타일 다르게 적용하기";

		final SpannableStringBuilder sps = new SpannableStringBuilder(str);
		sps.setSpan(new ForegroundColorSpan(-6697729), 4, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

		tv.append(sps);

	}
}
위의 코드를 적용시키면 아래와 같은 결과가 나오게된다.
만약 크기와 색을 동시에 바꾸고 싶다면?? 그냥 setSpan을 두번 해주면된다.
		sps.setSpan(new AbsoluteSizeSpan(30), 4, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		sps.setSpan(new ForegroundColorSpan(-6697729), 4, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);