Android 基于Socket发送表情

在构建聊天室功能时,遇到通过Socket发送表情的问题,经过长时间搜索未找到满意答案。最终,通过一个简单的思路解决了问题。使用ListView展示聊天内容,通过EditText输入,结合自定义的插入表情对话框,并定义相关接口,实现了表情的发送。
摘要由CSDN通过智能技术生成
 

   曾经一度被这个问题困扰了很久,在网上找了N久都没发现好方法,不是太麻烦,就是根本不能实现。

最后的最后终于这个被很可笑的解决的了,之所以可笑是因为我拿这个问题去问别人,那人思索良久,最后还是告诉我不能解决,但是可以提供一个思路,反正我也没办法了,就所幸听他说一下吧,一说果然是都被我试了N次而放弃的方法,但碍于面子就没打他,可是就在我装作很认真的听着的时候,忽然不经意的一句话给了我答案,于是就这么解决了,方法简单的要死,好吧,下面就说说吧

    首先我是用ListView显示的聊天内容(我弄的是一个聊天室的的东西),当然这都无所谓,之用一个EditText也OK,

这是我插入表情的对话框,相信不难看懂吧。

public void showImageDialog() {
		LayoutInflater inflater = LayoutInflater
				.from(AndroidClientActivity.this);
		LinearLayout layout = (LinearLayout) inflater.inflate(
				R.layout.dialoglayout, null);
		AlertDialog.Builder builder = new AlertDialog.Builder(
				AndroidClientActivity.this);
		builder.setTitle("选择表情")
		.setMessage("要添加的表情")
		.setView(layout);
		GridView gv = (GridView) layout.findViewById(R.id.gridview);
		
		g.simpleAdapter = new SimpleAdapter(AndroidClientActivity.this, list,
				R.layout.itemlayout, new String[] { "face" },
				new int[] { R.id.itemImageview });
		gv.setAdapter(g.simpleAdapter);
		gv.setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				@SuppressWarnings("unchecked")
				HashMap<String, Object> m = (HashMap<String, Object>) parent
						.getAdapter().getItem(position);
				
				CharSequence cs = Html.fromHtml("<img src='" + m.get("face")
						+ "'/>", imageGetter, null);
				System.out.println("face-----"+Html.toHtml((Spanned) cs));
				int cursor = etMsg.getSelectionStart();
				etMsg.getText().insert(cursor,cs);
		        
			}
		});

插入之前需要定义这样一个接口,这个在网上都是可以找到的

	ImageGetter imageGetter = new ImageGetter() {
		@Override
		public Drawable getDrawable(String source) {
			int id = Integer.parseInt(source);
			// 根据id从资源文件中获取图片对象
     		Drawable d = getResources().getDrawable(id);
		d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
		
			return d;
		}
	};

这是发送带图片的内容

		btnSend.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if (etMsg.getText().toString().equals("")) {
					Toast.makeText(getApplicationContext(), "发送信息为空",
							Toast.LENGTH_SHORT).show();
					return;
				}
				g.content =Html.toHtml(etMsg.getText());//只是将要发送的内容通过
Html.toHtml()方法转换了一下格式,可以打印出来看看效果
if (g.pw != null) {g.pw.println(msg.toString());g.pw.flush();etMsg.setText("");System.out.println("msg: "+msg.toString());msg.delete(0, msg.length());// Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show()}}});

下面就是我在BaseAdapte的getView方法中显示内容

public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater layoutInflater=LayoutInflater.from(context);
    convertView=(LinearLayout) layoutInflater.inflate(R.layout.chatitem, null);
	TextView et = (TextView) convertView.findViewById(R.id.tvChat);
	
	et.setText(Html.fromHtml(list.get(position), imageGetter, null));
	return convertView;
	
}
如果是直接用EditText显示的话就换成
et.setText(
et.setText(Html.fromHtml(list.get(position), imageGetter, null));
;

是不是很简单啊,其实就是两个方法 

et.setText(Html.fromHtml(list.get(position), imageGetter, null));
和
et.setText(Html.toHtml(list.get(position), imageGetter, null));


因为太简单了,所以就没说太多,希望能帮助到别人,如果不明白...,应该不会吧?







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值