import android.app.Activity;
import android.content.Intent;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnKeyListener;
import android.widget.AbsListView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.kirito.maptest.R;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
public class ChatActivity extends Activity {
private static final String TAG = "ChatActivity";
private ChatArrayAdapter chatArrayAdapter;
private ListView listView;
private EditText chatText;
private Button buttonSend;
Intent intent;
private boolean side = false;
private int roomNumber; // PORT겸용 (테스트용)
private String html = "";
private Handler mHandler;
private Socket socket;
DataInputStream is;
DataOutputStream os;
private String ip = "203.255.3.90"; // IP
//private int port = 9999; // PORT번호
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i = getIntent();
roomNumber = i.getIntExtra("ROOM_NUMBER", 7777);
setContentView(R.layout.activity_chat);
buttonSend = (Button) findViewById(R.id.buttonSend);
listView = (ListView) findViewById(R.id.listView1);
chatArrayAdapter = new ChatArrayAdapter(getApplicationContext(), R.layout.activity_chat_singlemessage);
listView.setAdapter(chatArrayAdapter);
chatText = (EditText) findViewById(R.id.chatText);
chatText.setOnKeyListener(new OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
return sendChatMessage();
}
return false;
}
});
buttonSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
sendChatMessage();
}
});
listView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
listView.setAdapter(chatArrayAdapter);
//to scroll the list view to bottom on data change
chatArrayAdapter.registerDataSetObserver(new DataSetObserver() {
@Override
public void onChanged() {
super.onChanged();
listView.setSelection(chatArrayAdapter.getCount() - 1);
}
});
mHandler = new Handler();
try {
setSocket(ip, roomNumber);
} catch (IOException e1) {
e1.printStackTrace();
}
}
private boolean sendChatMessage(){
final String chatStr = chatText.getText().toString();
chatArrayAdapter.add(new ChatMessage(side, chatStr));
chatText.setText("");
side = !side;
new Thread(){
@Override
public void run() {
super.run();
try {
os.writeUTF(chatStr); //서버로 메세지 보내기.UTF 방식으로(한글 전송가능...)
os.flush();
}catch(IOException e){
e.printStackTrace();
}
}
}.start();
return true;
}
@Override
protected void onStop() {
super.onStop();
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private Thread checkUpdate = new Thread() {
public void run() {
try {
String line;
Log.w("ChattingStart", "Start Thread");
while (true) {
Log.w("Chatting is running", "chatting is running");
line = is.readUTF();
html = line;
mHandler.post(showUpdate);
}
} catch (Exception e) {
Log.e("checkUpdate", e.toString());
}
}
};
private Runnable showUpdate = new Runnable() {
public void run() {
Toast.makeText(ChatActivity.this, "Coming word: " + html, Toast.LENGTH_SHORT).show();
}
};
public void setSocket(final String ip, final int port) throws IOException {
new Thread(){
@Override
public void run() {
try {
socket = new Socket(ip, port);
is=new DataInputStream(socket.getInputStream());
os=new DataOutputStream(socket.getOutputStream());
checkUpdate.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
채팅 Activity
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.kirito.maptest.R;
import java.util.ArrayList;
import java.util.List;
public class ChatArrayAdapter extends ArrayAdapter<ChatMessage> {
private TextView chatText;
private List<ChatMessage> chatMessageList = new ArrayList<ChatMessage>();
private LinearLayout singleMessageContainer;
@Override
public void add(ChatMessage object) {
chatMessageList.add(object);
super.add(object);
}
public ChatArrayAdapter(Context context, int textViewResourceId) {
super(context, textViewResourceId);
}
public int getCount() {
return this.chatMessageList.size();
}
public ChatMessage getItem(int index) {
return this.chatMessageList.get(index);
}
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.activity_chat_singlemessage, parent, false);
}
singleMessageContainer = (LinearLayout) row.findViewById(R.id.singleMessageContainer);
ChatMessage chatMessageObj = getItem(position);
chatText = (TextView) row.findViewById(R.id.singleMessage);
chatText.setText(chatMessageObj.message);
chatText.setBackgroundResource(chatMessageObj.left ? R.drawable.bubble_a : R.drawable.bubble_b);
singleMessageContainer.setGravity(chatMessageObj.left ? Gravity.LEFT : Gravity.RIGHT);
return row;
}
public Bitmap decodeToBitmap(byte[] decodedByte) {
return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
}
}
채팅 아답터
public class ChatMessage {
public boolean left;
public String message;
public ChatMessage(boolean left, String message) {
super();
this.left = left;
this.message = message;
}
}
코드가 이렇게 짜여있는데 상대방 즉 상대방이 보낸 메세지는 왼쪽에만 출력되게 하고 싶은데 어떻게 해아 할까요?