안 드 로 이 드 구현 간단 한 채 팅 방
7361 단어 android
여기 서 텍스트 를 표정 으로 바 꾸 는 방법 을 설명 합 니 다. 먼저 생각 을 말씀 드 리 겠 습 니 다. 먼저 우리 의 그림 은 로 컬 자원 디 렉 터 리 drawable 에 저장 되 고 모든 자원 파일 은 R 류 로 관리 되 기 때문에 정규 표현 식 을 이용 하여 이미지 id 를 찾 아 ImageSpan 으로 포장 한 다음 에 ImageSpan 을 SpannableString 에 넣 고 마지막 으로 SpannableString 을 edittext 에 넣 을 수 있 습 니 다.다음은 원본 코드 입 니 다.
package com.coreandroid.util;
import java.lang.reflect.Field;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ImageSpan;
import android.util.Log;
import com.coreandroid.chart.R;
public class ExpressionUtil {
/**
* spanableString , ,
*
* @param context
* @param spannableString
* @param patten
* @param start
*/
public static void matchExpression(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;
}
Field field = R.drawable.class.getDeclaredField(key);
int resId = field.getInt(null); // id
if (resId != 0) {
ImageSpan imageSpan = new ImageSpan(context, resId); // id bitmap, ImageSpan
int end = matcher.start() + key.length(); // ,
spannableString.setSpan(imageSpan, matcher.start(), end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //
if (end < spannableString.length()) { // , 。。
matchExpression(context, spannableString, patten, end);
}
break;
}
}
}
/**
* SpanableString , ,
*
* @param context
* @param str
* @return SpannableString
*/
public static SpannableString getExpressionString(Context context,
String str, String zhengze) {
SpannableString spannableString = new SpannableString(str);
Pattern sinaPatten = Pattern.compile(zhengze); // pattern
try {
matchExpression(context, spannableString, sinaPatten, 0);
} catch (Exception e) {
Log.e("dealExpression", e.getMessage());
}
return spannableString;
}
}
다음은 채 팅 기록 목록 의 adapter 입 니 다. 여 기 는 모든 Item 의 구 조 를 동태 적 으로 바 꾸 어 자신 인지 타인 의 발언 인지 구분 합 니 다. 구체 적 인 소스 코드 는 다음 과 같 습 니 다.
package com.coreandroid.adapter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import android.content.Context;
import android.text.SpannableString;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.coreandroid.chart.R;
import com.coreandroid.entity.MessageInfo;
import com.coreandroid.util.CommonUtils;
import com.coreandroid.util.ExpressionUtil;
public class ChartListAdapter extends BaseAdapter {
private Context context;
private LayoutInflater inflater;
private List data;
private DateFormat df;
public ChartListAdapter(Context context, List data) {
super();
this.context = context;
inflater = LayoutInflater.from(context);
this.data = data;
df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.chart_list_item, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.setData((MessageInfo) getItem(position));
return convertView;
}
private class ViewHolder {
private ImageView image;
private TextView text;
private TextView title;
private RelativeLayout rl;
public ViewHolder(View convertView) {
image = (ImageView) convertView
.findViewById(R.id.chart_list_item_headicon);
text = (TextView) convertView
.findViewById(R.id.chart_list_item_message);
title = (TextView) convertView
.findViewById(R.id.chart_list_item_title);
rl = (RelativeLayout) convertView
.findViewById(R.id.rl_chart_list_bottom);
}
public void setData(MessageInfo msg) {
RelativeLayout.LayoutParams rl_tv_msg_left = (RelativeLayout.LayoutParams) text
.getLayoutParams();
RelativeLayout.LayoutParams rl_iv_headicon_left = (RelativeLayout.LayoutParams) image
.getLayoutParams();
RelativeLayout.LayoutParams rl_tv_title = (RelativeLayout.LayoutParams) title
.getLayoutParams();
RelativeLayout.LayoutParams rl_buttom = (RelativeLayout.LayoutParams) rl
.getLayoutParams();
if (!CommonUtils.getDeviceId().equalsIgnoreCase(msg.getUsermac())) {
// mac
// , ; ,
rl_buttom.addRule(RelativeLayout.ALIGN_PARENT_TOP);
rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
rl_tv_title.addRule(RelativeLayout.BELOW,
R.id.rl_chart_list_bottom);
rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
rl_tv_msg_left.addRule(RelativeLayout.RIGHT_OF,
R.id.chart_list_item_headicon);
text.setBackgroundResource(R.drawable.incoming);
String titleStr = msg.getUsermac() + "-"
+ df.format(new Date());
title.setText(titleStr);
} else {
rl_buttom.addRule(RelativeLayout.ALIGN_PARENT_TOP);
rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
rl_tv_title.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rl_tv_title.addRule(RelativeLayout.BELOW,
R.id.rl_chart_list_bottom);
rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rl_iv_headicon_left.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
rl_tv_msg_left.addRule(RelativeLayout.LEFT_OF,
R.id.chart_list_item_headicon);
text.setBackgroundResource(R.drawable.outgoing);
String titleStr = df.format(new Date()) + "-"
+ msg.getUsermac();
title.setText(titleStr);
}
if (!TextUtils.isEmpty(msg.getHeadImage())) {
image.setImageBitmap(CommonUtils.strConvertBitmap(msg
.getHeadImage())); //
} else {
image.setImageResource(R.drawable.im);
}
String str = msg.getMessage(); //
try {
SpannableString spannableString = ExpressionUtil
.getExpressionString(context, str, CommonUtils.PATTERN);
text.setText(spannableString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
자, 핵심 코드 는 이미 인터넷 에 접속 하 였 습 니 다. 관심 있 는 것 은 원본 코드 를 다운로드 하여 연구 할 수 있 습 니 다!
원본 주소:http://download.csdn.net/detail/yaoyeyzq/4970408
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.