안 드 로 이 드 시 나 웨 이 보,QQ 공간 등 게시 물 표시(2)
이것 은 시 나 웨 이 보 의 한 게시 물 로 화제,표정,@친구 세 가지 디 스 플레이 를 포함한다.디 스 플레이 방법 은 전편 에서 설명 한 바 와 같이 SpannableString 을 사용 합 니 다.이 글 은 주로 이 게시 물 을 보 여 주 는 해석 도구 류 를 소개 한다.
실현
1.문자열 표시 와 대응 정규 표현 식
화 제 를 괄호 로 묶다
표정
친구
정규 매 칭 을 통 해 댓 글 정 보 를 분석 하 다.
화제->\#[^\#]+\#
표정->[^]+]
@친구->친구 닉네임
2.일반적인 방법 을 써 서 spanableString 에 대해 정규 판단 을 하고 요구 에 부합 되면 내용 을 변색 시킨다.
private static void dealPattern(int color, SpannableString spannableString, Pattern patten, int start) throws Exception {
Matcher matcher = patten.matcher(spannableString);
while (matcher.find()) {
String key = matcher.group();
// ,ture
if (matcher.start() < start) {
continue;
}
// ,
int end = matcher.start() + key.length();
// span
spannableString.setSpan(new ForegroundColorSpan(color), matcher.start(), end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
if (end < spannableString.length()) {
// , 。。
dealPattern(color, spannableString, patten, end);
}
break;
}
}
3.누 를 수 있 는 것 이 있어 야 하기 때문에 누 를 수 있 는 내용 을 처리 하 는 방법 이 필요 합 니 다.① 인 터 페 이 스 를 먼저 정의 하고 인 터 페 이 스 를 통 해 클릭 이 벤트 를 호출 자 에 게 전달
public interface SpanClickListener<T>{
void onSpanClick(T t);
}
② 일반적인 방법 을 써 서 spanableString 을 정규 적 으로 판단 하고 요구 에 부합 되면 내용 설정 을 클릭 할 수 있 습 니 다.
private static void dealClick(SpannableString spannableString, Pattern patten, int start, final SpanClickListener spanClickListener, final Object bean){
Matcher matcher = patten.matcher(spannableString);
while (matcher.find()) {
String key = matcher.group();
// ,ture
if (matcher.start() < start) {
continue;
}
// ,
int end = matcher.start() + key.length();
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
spanClickListener.onSpanClick(bean);
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
//
ds.setUnderlineText(false);//
}
}, matcher.start(), end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
if (end < spannableString.length()) {
// , 。。
dealClick(spannableString, patten, end, spanClickListener, bean);
}
break;
}
}
4.표정 해석 법
private void dealExpression(Context context,
SpannableString spannableString, Pattern patten, int start)
throws Exception {
Matcher matcher = patten.matcher(spannableString);
while (matcher.find()) {
String key = matcher.group();
if (matcher.start() < start) {
continue;
}
String value = emojiMap.get(key);
if (TextUtils.isEmpty(value)) {
continue;
}
// id
int resId = context.getResources().getIdentifier(value, "drawable",
context.getPackageName());
if (resId != 0) {
Drawable emoji = context.getResources().getDrawable(resId);
int w = (int) (emoji.getIntrinsicWidth() * 0.40);
int h = (int) (emoji.getIntrinsicHeight() * 0.40);
emoji.setBounds(0, 0, w, h);
// id bitmap, ImageSpan
ImageSpan imageSpan = new ImageSpan(emoji);
// ,
int end = matcher.start() + key.length();
//
spannableString.setSpan(imageSpan, matcher.start(), end,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
if (end < spannableString.length()) {
dealExpression(context, spannableString, patten, end);
}
break;
}
}
}
5.키워드 변색 처리 방법,이 실제 사용 장면,예 를 들 어 지도 키워드 검색,키워드 주소 에 일치 하 는 키워드 표시 특별 색상
public static SpannableString getKeyWordSpan(int color, String str, String patterStr) throws Exception {
SpannableString spannableString = new SpannableString(str);
Pattern patten = Pattern.compile(patterStr, Pattern.CASE_INSENSITIVE);
dealPattern(color, spannableString, patten, 0);
return spannableString;
}
6.화제 처리,매개 변수 에 화제 대상 이 들 어 와 야 합 니 다.여기 댓 글 중 에 하나 밖 에 없 는 상황 만 처 리 했 어 요.
public static SpannableString getTopicSpan(int color, String str, boolean clickable,SpanClickListener spanClickListener, Topic topic) throws Exception {
SpannableString spannableString = new SpannableString(str);
Pattern patten = Pattern.compile(PatternString.TOPIC_PATTERN, Pattern.CASE_INSENSITIVE);
if(clickable){
dealClick(spannableString, patten, 0, spanClickListener, topic);
}
dealPattern(color, spannableString, patten, 0);
return spannableString;
}
7.@친구 처리,매개 변수 에@친구 목록 을 입력 해 야 합 니 다.
public static SpannableString getAtUserSpan(int color, String str, boolean clickable, SpanClickListener spanClickListener, List<User> atUsers) throws Exception {
SpannableString spannableString = new SpannableString(str);
Pattern patten;
for (User u : atUsers) {
patten = Pattern.compile("@" + u.getName(), Pattern.CASE_INSENSITIVE);
if(clickable){
dealClick(spannableString, patten, 0, spanClickListener, u);
}
dealPattern(color, spannableString, patten, 0);
}
return spannableString;
}
8.표정 처리 가 깔끔 하 다
public static SpannableString getExpressionSpan(Context context, String str) throws Exception {
return ExpressionConvertUtil.getInstace().getExpressionString(context, str);
}
사용1.키워드 변색
private void testColoredKeywd() {
String string = "Android “ ”, Google 2007 11 5 ,Android logo ,Android logo (36 )
";
SpannableString cardText = null;
try {
cardText = SpanUtils.getKeyWordSpan(getResources().getColor(R.color.md_green_600), string, "Android");
} catch (Exception e) {
e.printStackTrace();
}
tvColoredKeywd.setText(cardText);
}
2.화제 테스트,주의해 야 할 것 은 일부 내용 을 클릭 할 수 있 도록 tvTopic.setMovement Method(LinkMovement Method.getInstance()를 설정 해 야 합 니 다.그렇지 않 으 면 클릭 하면 효과 가 없습니다.
private void testTopic() {
String topic = "# # ~L
";
SpannableString topicText = null;
try {
topicText = SpanUtils.getTopicSpan(Color.BLUE, topic, true, new SpanUtils.SpanClickListener<Topic>() {
@Override
public void onSpanClick(Topic t) {
Toast.makeText(MainActivity.this, " :" + t.toString() , Toast.LENGTH_SHORT).show();
}
}, new Topic(1, " "));
} catch (Exception e) {
e.printStackTrace();
}
tvTopic.setText(topicText);
// ,
tvTopic.setMovementMethod(LinkMovementMethod.getInstance());
}
3.친구 테스트
private void textAtUsers(){
List<User> users = new ArrayList<>();
users.add(new User(1, " 1"));
users.add(new User(2, " 2"));
StringBuilder sb = new StringBuilder(" ");
for (User u : users) {
sb.append("@").append(u.getName());
}
sb.append("
");
try {
SpannableString atSpan = SpanUtils.getAtUserSpan(Color.BLUE, sb.toString(), true, new SpanUtils.SpanClickListener<User>() {
@Override
public void onSpanClick(User user) {
Toast.makeText(MainActivity.this, "@ :" + user.toString(), Toast.LENGTH_SHORT).show();
}
}, users);
tvTestAt.setText(atSpan);
tvTestAt.setMovementMethod(LinkMovementMethod.getInstance());
} catch (Exception e) {
e.printStackTrace();
}
}
4.표정 테스트
private void textExpression(){
String exStr = " [ ], [ ]";
SpannableString span = null;
try {
span = SpanUtils.getExpressionSpan(this, exStr);
} catch (Exception e) {
e.printStackTrace();
}
tvExpression.setText(span);
}
효과 도다운로드:https://github.com/LineChen/SpannableStringDemo
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.