在drawable中新建文件,type的类型还有圆形,扇形
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:type="linear"
android:startColor="#aee3d9"
android:centerColor="#d5decd"
android:endColor="#fff4de"
android:angle="-90"/>
</shape>
聊天程序设计
主布局(list_message.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/grid_in_below"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#18b4ed"
android:gravity="center"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="杜 Q"
android:textSize="20sp" />
</LinearLayout>
<ListView
android:id="@+id/msg_list_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@drawable/dialog_background"
android:cacheColorHint="#ffffffff"
android:divider="#55ff0000" >
</ListView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ebecee"
android:gravity="center" >
<ImageView
android:id="@+id/image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.20"
android:src="@drawable/eoj" />
<Button
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginBottom="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp" />
<Button
android:id="@+id/left_send"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_gravity="bottom"
android:layout_margin="5dp"
android:background="@drawable/obtain_verification"
android:padding="5dp"
android:text="left" />
<EditText
android:id="@+id/input_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:layout_weight="1"
android:background="@drawable/edit_shape"
android:ems="10"
android:hint="请输入要发送的内容"
android:inputType="textMultiLine"
android:maxHeight="200dp"
android:maxLines="8"
android:minHeight="30dp"
android:paddingBottom="5dp"
android:paddingTop="5dp" >
</EditText>
<Button
android:id="@+id/right_send"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_gravity="bottom"
android:layout_margin="5dp"
android:background="@drawable/obtain_verification"
android:padding="5dp"
android:text="right" />
</LinearLayout>
<GridView
android:id="@+id/image_gridView"
android:layout_width="match_parent"
android:layout_height="200dp"
android:background="#ffffff"
android:numColumns="5"
android:visibility="gone" >
</GridView>
</LinearLayout>
单条左边Msg的布局(send_receive.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text=""
android:textColor="#000000" />
<LinearLayout
android:id="@+id/left_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="left" >
<ImageView
android:id="@+id/left_image_view_head"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@drawable/ic_launcher" />
<LinearLayout
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/left_office_title_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/yingzhang_shape_background"
android:text="营长"
android:textColor="@color/white"
android:textSize="15sp" />
<TextView
android:id="@+id/left_nicheng"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="昵称"
android:textColor="#000000" />
</LinearLayout>
<TextView
android:id="@+id/left_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="70dp"
android:background="@drawable/eng"
android:gravity="center"
android:text="dddddddddddddddddddddddddddddddddddddddd"
android:textColor="#000000"
android:textSize="20sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
单条右边Msg的布局(send_right.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="right"
android:orientation="vertical" >
<TextView
android:id="@+id/right_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="10dp"
android:text=""
android:textColor="#000000" />
<LinearLayout
android:id="@+id/right_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="right"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:gravity="right" >
<TextView
android:id="@+id/right_nicheng"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="454"
android:textColor="#000000" />
<TextView
android:id="@+id/right_office_title_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/yingzhang_shape_background"
android:text="营长" />
</LinearLayout>
<TextView
android:id="@+id/right_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="70dp"
android:background="@drawable/eog"
android:gravity="center"
android:text="kl"
android:textColor="#000000"
android:textSize="20sp" />
</LinearLayout>
<ImageView
android:id="@+id/right_image_view_head"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@drawable/ic_launcher" />
</LinearLayout>
</LinearLayout>
Msg的适配器类
package com.normal.mymsg;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import com.test.login.R;
import com.test.message_send_receive.Msg;
import android.graphics.drawable.Drawable;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter {
public static final int TYPE_RECEIVED = 0;
public static final int TYPE_SEND = 1;
public static final int MAX_TYPE = 2;
private LayoutInflater mInflater;
private List<MyMsg> mData;
private Html.ImageGetter mImageGetter;
private SimpleDateFormat mFormat = new SimpleDateFormat("EE HH:mm");
public MyAdapter(LayoutInflater mInflater, List<MyMsg> mData, Html.ImageGetter mImageGetter) {
this.mInflater = mInflater;
this.mData = mData;
this.mImageGetter = mImageGetter;
}
@Override
public int getItemViewType(int position) {
return mData.get(position).getType();
}
@Override
public int getViewTypeCount() {
return MAX_TYPE;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
ViewHolderRight vRight = null;
ViewHolder viewHolder = null;
if (convertView == null) {
switch (type) {
case TYPE_RECEIVED:
convertView = mInflater.inflate(R.layout.send_receive, null);
viewHolder = new ViewHolder();
viewHolder.leftLayout = (LinearLayout) convertView.findViewById(R.id.left_layout);
viewHolder.imageView_header = (ImageView) convertView.findViewById(R.id.left_image_view_head);
viewHolder.textview_time = (TextView) convertView.findViewById(R.id.time);
viewHolder.textview_message = (TextView) convertView.findViewById(R.id.left_msg);
viewHolder.textview_nicheng = (TextView) convertView.findViewById(R.id.left_nicheng);
viewHolder.textview_ofice_title = (TextView) convertView.findViewById(R.id.left_office_title_text);
convertView.setTag(viewHolder);
break;
case TYPE_SEND:
convertView = mInflater.inflate(R.layout.send_right, null);
vRight = new ViewHolderRight();
vRight.rightLayout = (LinearLayout) convertView.findViewById(R.id.right_layout);
vRight.imageView_header = (ImageView) convertView.findViewById(R.id.right_image_view_head);
vRight.textview_time = (TextView) convertView.findViewById(R.id.right_time);
vRight.textview_message = (TextView) convertView.findViewById(R.id.right_msg);
vRight.textview_nicheng = (TextView) convertView.findViewById(R.id.right_nicheng);
vRight.textview_ofice_title = (TextView) convertView.findViewById(R.id.right_office_title_text);
convertView.setTag(vRight);
break;
default:
break;
}
}
MyMsg msg = mData.get(position);
switch (type) {
case TYPE_RECEIVED:
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.imageView_header.setImageResource(R.drawable.ic_launcher);
String time = mFormat.format(new Date(msg.getTime()));
viewHolder.textview_time.setText(time);
viewHolder.textview_message.setText(Html.fromHtml(msg.getMessage(), mImageGetter, null));
viewHolder.textview_nicheng.setText(msg.getNicheng());
viewHolder.textview_ofice_title.setText(msg.getOffice_title());
break;
case TYPE_SEND:
vRight = (ViewHolderRight) convertView.getTag();
vRight.imageView_header.setImageResource(R.drawable.ic_launcher);
String time2 = mFormat.format(new Date(msg.getTime()));
vRight.textview_time.setText(time2);
vRight.textview_message.setText(Html.fromHtml(msg.getMessage(), mImageGetter, null));
vRight.textview_nicheng.setText(msg.getNicheng());
vRight.textview_ofice_title.setText(msg.getOffice_title());
break;
default:
break;
}
return convertView;
}
class ViewHolder {
LinearLayout leftLayout;
ImageView imageView_header;
TextView textview_ofice_title;
TextView textview_nicheng;
TextView textview_time;
TextView textview_message;
}
class ViewHolderRight {
LinearLayout rightLayout;
ImageView imageView_header;
TextView textview_ofice_title;
TextView textview_nicheng;
TextView textview_time;
TextView textview_message;
}
}
MyMsg类
package com.normal.mymsg;
import android.text.Spanned;
public class MyMsg {
private int image;
private String office_title;
private String nicheng;
private Long time;
private String message;
private int type;
public static final int TYPE_RECEIVED=0;
public static final int TYPE_SEND=1;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public MyMsg(int image, String office_title, String nicheng, Long time, String message) {
this.image = image;
this.office_title = office_title;
this.nicheng = nicheng;
this.time = time;
this.message = message;
}
public void setImage(int image) {
this.image = image;
}
public void setOffice_title(String office_title) {
this.office_title = office_title;
}
public void setNicheng(String nicheng) {
this.nicheng = nicheng;
}
public void setTime(Long time) {
this.time = time;
}
public void setMessage(String message) {
this.message = message;
}
public MyMsg() {
}
public int getImage() {
return image;
}
public String getOffice_title() {
return office_title;
}
public String getNicheng() {
return nicheng;
}
public Long getTime() {
return time;
}
public String getMessage() {
return message;
}
}
主函数类
package com.test.message_send_receive;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import com.normal.image.ExpresionAdapter;
import com.normal.mymsg.MyAdapter;
import com.normal.mymsg.MyMsg;
import com.test.login.R;
import com.test.login.R.layout;
import com.test.message_image.ConcreteWatched;
import com.test.message_image.ImageAdapter;
import com.test.message_image.ImageDialog;
import com.test.message_image.MsgImage;
import com.test.message_image.Watched;
import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.text.Html;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.SpannedString;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
public class MainMessage extends Activity implements OnClickListener {
private Html.ImageGetter mImageGeter;
private ListView mListView;
private EditText mEditText;
private ImageView mImageView;
private LayoutInflater mInflater;
private Button mLeftSend;
private Button mRightSend;
private MyAdapter myAdapter;
private List<MyMsg> myListImage = new ArrayList<>();
private Button mImage;
private ExpresionAdapter mExpresionAdapter;
private GridView mTeacheGridView;
private String[] mImageData = { "dra", "drb", "drc", "drd", "dre", "drf", "drg", "drh", "dri", "drj", "drk", "drl",
"drm", "drn", "dro", "drp", "drq", "drr", "drs", "drt", "dru", "drv", "drw", "drx", "dry", "drz" };
private PopupWindow mPopupWindow;
private LinearLayout gridBelow;
private GridView mPopGridView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_message);
mPopupWindow = new PopupWindow(this);
mPopupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
mPopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mPopupWindow.setFocusable(true);
mPopupWindow.setOutsideTouchable(true);
View popupWindow = getLayoutInflater().inflate(R.layout.popupview, null);
mPopupWindow.setContentView(popupWindow);
mPopGridView = (GridView) popupWindow.findViewById(R.id.pop_gridView);
gridBelow = (LinearLayout) findViewById(R.id.grid_in_below);
mImageView = (ImageView) findViewById(R.id.image_view);
mListView = (ListView) findViewById(R.id.msg_list_view);
mImage = (Button) findViewById(R.id.image);
mImage.setOnClickListener(this);
mLeftSend = (Button) findViewById(R.id.left_send);
mLeftSend.setOnClickListener(this);
mRightSend = (Button) findViewById(R.id.right_send);
mRightSend.setOnClickListener(this);
mTeacheGridView = (GridView) findViewById(R.id.image_gridView);
"****重点****"
mInflater = getLayoutInflater();
mImageGeter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable drawable = null;
if (source != null) {
Class clazz = R.drawable.class;
try {
Field field = clazz.getDeclaredField(source);
int sourcedId = field.getInt(clazz);
drawable = getResources().getDrawable(sourcedId);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
} else {
drawable = getResources().getDrawable(R.drawable.ic_launcher);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
}
return drawable;
}
};
mImageView.setOnClickListener(this);
mExpresionAdapter = new ExpresionAdapter(getLayoutInflater());
mTeacheGridView.setAdapter(mExpresionAdapter);
mPopGridView.setAdapter(mExpresionAdapter);
myAdapter = new MyAdapter(mInflater, myListImage, mImageGeter);
mListView.setAdapter(myAdapter);
mTeacheGridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Spanned span = Html.fromHtml("<img src='" + mImageData[position] + "'/>", mImageGeter, null);
mEditText.getText().insert(mEditText.getSelectionStart(), span);
}
});
mPopGridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Spanned span = Html.fromHtml("<img src='" + mImageData[position] + "'/>", mImageGeter, null);
mEditText.getText().insert(mEditText.getSelectionStart(), span);
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.left_send:
MyMsg msg = new MyMsg();
msg.setImage(R.drawable.ic_launcher);
msg.setMessage(filterHtml(Html.toHtml(mEditText.getText())));
msg.setNicheng("小康");
msg.setOffice_title("营长");
msg.setTime(System.currentTimeMillis());
msg.setType(MyAdapter.TYPE_RECEIVED);
myListImage.add(msg);
myAdapter.notifyDataSetChanged();
mListView.setSelection(myListImage.size() - 1);
mEditText.setText("");
break;
case R.id.right_send:
MyMsg msg1 = new MyMsg();
msg1.setImage(R.drawable.ic_launcher);
msg1.setMessage(filterHtml(Html.toHtml(mEditText.getText())));
msg1.setNicheng("小康");
msg1.setOffice_title("营长");
msg1.setTime(System.currentTimeMillis());
msg1.setType(MyAdapter.TYPE_SEND);
myListImage.add(msg1);
myAdapter.notifyDataSetChanged();
mListView.setSelection(myListImage.size() - 1);
mEditText.setText("");
break;
case R.id.image:
if (mPopGridView.getVisibility() == View.VISIBLE) {
mPopGridView.setVisibility(View.GONE);
} else {
mPopGridView.setVisibility(View.VISIBLE);
}
mPopupWindow.showAsDropDown(gridBelow);
break;
case R.id.image_view:
if (mTeacheGridView.getVisibility() == View.VISIBLE) {
mTeacheGridView.setVisibility(View.GONE);
} else {
mTeacheGridView.setVisibility(View.VISIBLE);
}
break;
}
}
private String filterHtml(String str) {
str = str.replaceAll("<(?!br|img)[^>]+>", "").trim();
return str;
}
}
Image的布局(teache_image.xml)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/teache_image"
android:padding="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
ExpresionAdapter 的适配器
package com.normal.image;
import com.test.login.R;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
public class ExpresionAdapter extends BaseAdapter {
private int[] mData = { R.drawable.dra, R.drawable.drb, R.drawable.drc, R.drawable.drd, R.drawable.dre,
R.drawable.drf, R.drawable.drg, R.drawable.drh, R.drawable.dri, R.drawable.drj, R.drawable.drk,
R.drawable.drl, R.drawable.drm, R.drawable.drn, R.drawable.dro, R.drawable.dro, R.drawable.drq,
R.drawable.drr, R.drawable.drs, R.drawable.drt, R.drawable.dru, R.drawable.drv, R.drawable.drw,
R.drawable.drx, R.drawable.dry, R.drawable.drz };
private LayoutInflater mInflater;
public ExpresionAdapter(LayoutInflater mInflater) {
this.mInflater = mInflater;
}
@Override
public int getCount() {
return mData.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = mInflater.inflate(R.layout.teache_image, null);
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.teache_image);
convertView.setTag(viewHolder);
}
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.imageView.setImageResource(mData[position]);
return convertView;
}
class ViewHolder {
ImageView imageView;
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<GridView
android:id="@+id/pop_gridView"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:numColumns="5"></GridView>
</LinearLayout>