본문 바로가기

IT/안드로이드 관련

[안드로이드] 더보기 기능(TextView ReadMore)

안녕하세요. YTS 입니다. 


오늘은 TextView의 더보기 기능에 대해 적어보려합니다.


더보기 기능은 페이스북, 인스타 등 기본적으로 SNS 에서 등장하는 기능인데요.


생각보다 마땅한 라이브러리가 없어 실제로 구현해봤습니다.


public static void setReadMore(final TextView view, final String text, final int maxLine) {
final Context context = view.getContext();
final String expanedText = " ... 더보기";

if (view.getTag() != null && view.getTag().equals(text)) { //Tag로 전값 의 text를 비교하여똑같으면 실행하지 않음.
return;
}
view.setTag(text); //Tag에 text 저장
view.setText(text); // setText를 미리 하셔야 getLineCount()를 호출가능
view.post(new Runnable() { //getLineCount()는 UI 백그라운드에서만 가져올수 있음
@Override
public void run() {
if (view.getLineCount() >= maxLine) { //Line Count가 설정한 MaxLine의 값보다 크다면 처리시작

int lineEndIndex = view.getLayout().getLineVisibleEnd(maxLine - 1); //Max Line 까지의 text length

String[] split = text.split("\n"); //text를 자름
int splitLength = 0;

String lessText = "";
for (String item : split) {
splitLength += item.length() + 1;
if (splitLength >= lineEndIndex) { //마지막 줄일때!
if (item.length() >= expanedText.length()) {
lessText += item.substring(0, item.length() - (expanedText.length())) + expanedText;
} else {
lessText += item + expanedText;
}
break; //종료
}
lessText += item + "\n";
}
SpannableString spannableString = new SpannableString(lessText);
spannableString.setSpan(new ClickableSpan() {//클릭이벤트
@Override
public void onClick(View v) {
view.setText(text);
}

@Override
public void updateDrawState(TextPaint ds) { //컬러 처리
ds.setColor(ContextCompat.getColor(context, R.color.gray_dark));
}
}, spannableString.length() - expanedText.length(), spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
view.setText(spannableString);
view.setMovementMethod(LinkMovementMethod.getInstance());
}
}
});
}


참고로 String을 subString으로 자르면 개행문자("\n")이 다 없어지는 현상이 발생하더라구요!


그래서 String split를 써써 배열로 나눈뒤 \n을 다시 붙히는 형태로 처리하였습니다!


더 나은 로직이나 잘못된 부분이 있으면 댓글로 남겨주세요!


감사합니다!