学习android也有半年时间了,逐渐由一个菜鸟入门。这是自己写得第一遍技术文章,算是鼓励下自己的学习吧,纪念一下。
和同学一起做的一个小东西,需要实现android客户端发送表情和文字(评论),上传到服务器,然后需要更新数据得到表情和文字展示。基本思路是在editText中利用android中的Html类和ImageGetter展示表情,发送数据时用@+ImageId+@代替发送文字和为图片到服务器,展示时在textView中展示图片。在网上找过很多例子,发现发送很容易实现,但是展示的时候总是出现包含obj的小方块,表情无法正常显示,于是想到了这样一个方法,经过实验发现还是简单可行的。下面是主要功能代码,xml文件等就不粘贴了。
1.发送表情页面
private OnClickListener expressionButtonListener=new OnClickListener(){
@Override
public void onClick(View v) {
Context mContext = TitleDetailActivity.this;
LayoutInflater mLayoutInflater = (LayoutInflater) mContext
.getSystemService(LAYOUT_INFLATER_SERVICE);
View expression_popunwindwow = mLayoutInflater.inflate(
R.layout.expressions, null);
ImageView im1=(ImageView)(expression_popunwindwow.findViewById(R.id.expression1IV));
ImageView im2=(ImageView)(expression_popunwindwow.findViewById(R.id.expression2IV));
ImageView im3=(ImageView)(expression_popunwindwow.findViewById(R.id.expression3IV));
ImageView im4=(ImageView)(expression_popunwindwow.findViewById(R.id.expression4IV));
ImageView im5=(ImageView)(expression_popunwindwow.findViewById(R.id.expression5IV));
ImageView im6=(ImageView)(expression_popunwindwow.findViewById(R.id.expression6IV));
ImageView im7=(ImageView)(expression_popunwindwow.findViewById(R.id.expression7IV));
ImageView im8=(ImageView)(expression_popunwindwow.findViewById(R.id.expression8IV));
ImageView im9=(ImageView)(expression_popunwindwow.findViewById(R.id.expression9IV));
im1.setOnClickListener(expressionImageViewClickLintener);
im2.setOnClickListener(expressionImageViewClickLintener);
im3.setOnClickListener(expressionImageViewClickLintener);
im4.setOnClickListener(expressionImageViewClickLintener);
im5.setOnClickListener(expressionImageViewClickLintener);
im6.setOnClickListener(expressionImageViewClickLintener);
im7.setOnClickListener(expressionImageViewClickLintener);
im8.setOnClickListener(expressionImageViewClickLintener);
im9.setOnClickListener(expressionImageViewClickLintener);
mpopupWindow = new PopupWindow(expression_popunwindwow,
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
mpopupWindow.showAtLocation(findViewById(R.id.titleDetailMain), Gravity.BOTTOM|Gravity.RIGHT, 50, 50);
}
};
private OnClickListener expressionImageViewClickLintener=new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
mpopupWindow.dismiss();
ImageGetter ig = new ImageGetter(){
@Override
public Drawable getDrawable(String source) {
// TODO Auto-generated method stub
int imageId= Integer.parseInt(source);
Drawable d = getResources().getDrawable(imageId);
d.setBounds(0, 0, d.getIntrinsicWidth(),d.getIntrinsicHeight());
return d;
}
};
//需要判断
int drawableID = 0;
switch(v.getId()){
case R.id.expression1IV: drawableID=R.drawable.expression1;break;
case R.id.expression2IV: drawableID=R.drawable.expression2;break;
case R.id.expression3IV: drawableID=R.drawable.expression3;break;
case R.id.expression4IV: drawableID=R.drawable.expression4;break;
case R.id.expression5IV: drawableID=R.drawable.expression5;break;
case R.id.expression6IV: drawableID=R.drawable.expression6;break;
case R.id.expression7IV: drawableID=R.drawable.expression7;break;
case R.id.expression8IV: drawableID=R.drawable.expression8;break;
case R.id.expression9IV: drawableID=R.drawable.expression9;break;
}
CharSequence cs =Html.fromHtml("<img src='"+drawableID+"'/>", ig, null);
System.out.println(cs);
tdResponseCommentContent.append(cs);
String faceContent =FilterHtml(Html.toHtml(tdResponseCommentContent.getText()));
}
};
public static String FilterHtml(String str){
str = str .replaceAll("<(?!br|img)[^>]+>", "").trim();
//return UnicodeToGBK2(str);
String str2 = str.replace("<img src=\"", "@");
String str3 = str2.replace("\">","@");
return str3;
}
2.展示表情代码
public OneCommentLayout(Context context, AttributeSet attrs,Comment comment) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.onecomment, this, true);
peopleName = (TextView) findViewById(R.id.ocPeopleName);
commentTime = (TextView) findViewById(R.id.ocTime);
commentContent = (TextView) findViewById(R.id.ocContent);
String commentBodyStr = comment.getCommentContent();
peopleName.setText(comment.getCommenterName());
commentTime.setText(comment.getCommentTime());
filterContent(commentBodyStr,commentContent);
}
/**
* 设置显示的文字
*/
public void filterContent(String str,TextView commentContent){
System.out.println(str);
ImageGetter ig = new ImageGetter(){
@Override
public Drawable getDrawable(String source) {
// TODO Auto-generated method stub
int imageId= Integer.parseInt(source);
Drawable d = getResources().getDrawable(imageId);
d.setBounds(0, 0, d.getIntrinsicWidth(),d.getIntrinsicHeight());
return d;
}
};
//String c = "abc@234@df@3423@";
// 正则初始化
Pattern p = Pattern.compile("@[0-9]+@");
// 匹配器初始化
Matcher m = p.matcher(str);
// 匹配查询
String[] strs = new String[10]; //设置了10个最大值
String target = str;
int i=0;
while (m.find()) {
strs[i]=m.group(0);
i++;
}
commentContent.setText("");
for(int j=0;j<i;j++){
int before = target.indexOf(strs[j]);
int after = before+strs[j].length();
commentContent.append(target.substring(0, before));
String strid=strs[j].substring(1, strs[j].length()-1);
CharSequence cs= Html.fromHtml("<img src='"+strid+"'/>", ig, null);
commentContent.append(cs);
if(j==i-1)
{
commentContent.append(target.substring(after, target.length()));
}
}
if(i==0) commentContent.append(str);
}