在android中创建一个chatView布局
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/11202206/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
create a chatView layout in android
提问by thepoosh
I'm creating a chat application and I'm thinking on ways to create the actual chat view.
我正在创建一个聊天应用程序,我正在考虑创建实际聊天视图的方法。
I already have the layout for the chat window itself but I was thinking about how to implement the chat messages.
我已经有了聊天窗口本身的布局,但我正在考虑如何实现聊天消息。
I was thinking of creating a TableLayout
and each row will be the users image and the chat message (or bubble or what not).
我正在考虑创建一个TableLayout
,每一行都将是用户图像和聊天消息(或气泡或其他内容)。
Does anyone have an idea on how to design and create these rows?
有没有人知道如何设计和创建这些行?
this is what I did up to now:
这就是我到目前为止所做的:
<?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:background="@android:color/background_light"
android:orientation="vertical"
android:weightSum="10" >
<ScrollView
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1" >
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:stretchColumns="1" >
<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<!-- insert chat message here !-->
</TableRow>
<View
android:layout_height="2dip"
android:background="#000" />
<TableRow
android:id="@+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<!-- next chat message --!>
</TableRow>
</TableLayout>
</ScrollView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="9"
android:orientation="horizontal" >
<EditText
android:id="@+id/chatLine"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Say:"
android:imeOptions="actionSend"
android:singleLine="true" />
</LinearLayout>
</LinearLayout>
我正在努力实现这种外观

回答by Praveenkumar
How about below code -
下面的代码怎么样 -
Main.xml
主文件
<LinearLayout android:id="@+id/list_layout"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:background="@drawable/background"
xmlns:android="http://schemas.android.com/apk/res/android">
<ListView android:id="@+id/myList"
android:layout_height="fill_parent"
android:layout_width="wrap_content"/>
</LinearLayout>
list_row_layout_even.xml
list_row_layout_even.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/even_container"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView android:id="@+id/user_img"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginTop="80dip"
android:src="@drawable/sample_image"/>
<ImageView android:id="@+id/even_bubble"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_alignParentRight="true"
android:layout_margin="5dip"
android:src="@drawable/even"/>
<TextView android:id="@+id/text"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_alignParentRight="true"
android:textColor="#000000"
android:textSize="16dip"
android:layout_marginRight="8dip"
android:layout_marginLeft="120dip"
android:layout_marginTop="10dip" />
</RelativeLayout>
list_row_layout_odd.xml
list_row_layout_odd.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/even_container"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<ImageView android:id="@+id/user_img"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginTop="80dip"
android:layout_alignParentRight="true"
android:src="@drawable/sample_image"/>
<ImageView android:id="@+id/odd_bubble"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_alignParentLeft="true"
android:layout_margin="5dip"
android:src="@drawable/odd"/>
<TextView android:id="@+id/text"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_alignParentLeft="true"
android:textColor="#ffffff"
android:textSize="16dip"
android:layout_marginRight="120dip"
android:layout_marginLeft="8dip"
android:layout_marginTop="10dip" />
</RelativeLayout>
This is my output -
这是我的输出 -
回答by Paresh Mayani
Instead of TableLayout, i would suggest you to create Custom adapter for ListView. You just need to check the condition to change the background of layout/views inside getViews()
method.
我建议您为 ListView 创建自定义适配器,而不是 TableLayout 。您只需要检查条件即可更改getViews()
方法内部布局/视图的背景。
Some thread may be helpful to you:
一些线程可能对你有帮助:
回答by Charaf Eddine Mechalikh
list_item_message_left.xml
list_item_message_left.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="left"
android:orientation="vertical"
android:paddingBottom="5dp"
android:paddingRight="10dp"
android:paddingTop="5dp" >
<TextView
android:id="@+id/lblMsgFrom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:textColor="#777777"
android:textSize="12dp"
android:textStyle="italic" />
<RelativeLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txtMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_msg_from"
android:paddingBottom="5dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="5dp"
android:textColor="#ff717171"
android:textSize="16dp"
android:layout_toRightOf="@+id/textView27"
android:layout_marginRight="50dp" />
<TextView
android:id="@+id/textView27"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/triangle_msg_from"
android:paddingRight="10dp"
android:textColor="#ffffff"
android:textSize="16dp"
android:paddingLeft="10dp"
android:paddingTop="2dp"
android:layout_alignParentLeft="true"
android:layout_marginTop="3dp" />
</RelativeLayout>
</LinearLayout>
list_item_message_right.xml
list_item_message_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"
android:paddingBottom="5dp"
android:paddingRight="10dp"
android:paddingTop="5dp" >
<TextView
android:id="@+id/lblMsgFrom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="5dp"
android:textColor="#777777"
android:textSize="12dp"
android:textStyle="italic" />
<RelativeLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txtMsg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/bg_msg_you"
android:paddingBottom="5dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:paddingTop="5dp"
android:textColor="#ffffff"
android:textSize="16dp"
android:layout_toLeftOf="@+id/textView27"
android:layout_marginLeft="50dp" />
<TextView
android:id="@+id/textView27"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/triangle_msg_you"
android:paddingRight="10dp"
android:textColor="#ffffff"
android:textSize="16dp"
android:paddingLeft="10dp"
android:paddingTop="2dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginTop="3dp" />
</RelativeLayout>
</LinearLayout>
bg_msg_from.xml
bg_msg_from.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape
android:shape="rectangle" >
<solid android:color="#C0C0C0" >
</solid>
<corners android:radius="5dp" >
</corners>
</shape>
</item>
<item>
<shape
android:shape="rectangle" >
<solid android:color="#D8D8D8">
</solid>
<corners android:radius="5dp" >
</corners>
</shape>
</item>
</selector>
bg_msg_you.xml
bg_msg_you.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape
android:shape="rectangle" >
<solid android:color="#007AE5" >
</solid>
<corners android:radius="5dp" >
</corners>
</shape>
</item>
<item>
<shape
android:shape="rectangle" >
<solid android:color="#0084FF" >
</solid>
<corners android:radius="5dp" >
</corners>
</shape>
</item>
</selector>
triangle_msg_from.xml
triangle_msg_from.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" >
<rotate
android:fromDegrees="45"
android:toDegrees="45"
android:pivotX="87%"
android:pivotY="140%" >
<shape
android:shape="rectangle" >
<stroke android:color="#C0C0C0" android:width="10dp"/>
</shape>
</rotate>
</item>
<item>
<rotate
android:fromDegrees="45"
android:toDegrees="45"
android:pivotX="87%"
android:pivotY="140%" >
<shape
android:shape="rectangle" >
<stroke android:color="#D8D8D8" android:width="10dp"/>
</shape>
</rotate>
</item>
</layer-list>
triangle_msg_you.xml
triangle_msg_you.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:state_pressed="true" >
<rotate
android:fromDegrees="45"
android:toDegrees="45"
android:pivotX="13%"
android:pivotY="-40%" >
<shape
android:shape="rectangle" >
<stroke android:color="#007AE5" android:width="10dp"/>
</shape>
</rotate>
</item>
<item>
<rotate
android:fromDegrees="45"
android:toDegrees="45"
android:pivotX="13%"
android:pivotY="-40%" >
<shape
android:shape="rectangle" >
<stroke android:color="#0084FF" android:width="10dp"/>
</shape>
</rotate>
</item>
</layer-list>
messageListAdapter.java
消息列表适配器.java
package eddine.charef.mechalikh....;
import java.util.List;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MessagesListAdapter extends BaseAdapter {
private Context context;
private List<Msg> messagesItems;
public MessagesListAdapter(Context context, List<Msg> navDrawerItems) {
this.context = context;
this.messagesItems = navDrawerItems;
}
@Override
public int getCount() {
return messagesItems.size();
}
@Override
public Msg getItem(int position) {
return messagesItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@SuppressLint("InflateParams")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Msg m = messagesItems.get(position);
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (messagesItems.get(position).getleMien()) {
convertView = mInflater.inflate(R.layout.list_item_message_right,
null);
} else {
convertView = mInflater.inflate(R.layout.list_item_message_left,
null);
}
TextView lblFrom = (TextView) convertView.findViewById(R.id.lblMsgFrom);
TextView txtMsg = (TextView) convertView.findViewById(R.id.txtMsg);
txtMsg.setText(m.getMessage()+"\n"+m.getAttach());
lblFrom.setText(m.getDate()+" - "+m.getHeure());
return convertView;
}
}
Msg.java
消息文件
package eddine.charef.mechalikh....;
public class Msg {
private String email, message;
private boolean leMien;
private String attach;
private String cle;
private String teleAttach;
private String heure;
private String date;
public Msg(String cle,String email, String message,String attach,boolean leMien,String teleAttach,String heure,String date) {
this.email = email;
this.message = message;
this.leMien = leMien;
this.attach = attach;
this.cle=cle;
this.teleAttach = teleAttach;
this.heure = heure;
this.date=date;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public boolean getleMien() {
return leMien;
}
public void setleMien(boolean leMien) {
this.leMien = leMien;
}
public String getAttach() {
return attach ;
}
public void setAttach(String attach) {
this.attach = attach;
}
public String getCle() {
return cle ;
}
public void setCle(String cle) {
this.cle = cle;
}
public void setTeleAttach(String teleAttach) {
this.teleAttach = teleAttach;
}
public String getTeleAttach() {
return teleAttach ;
}
public void setHeure(String heure) {
this.heure = heure;
}
public String getHeure() {
return heure ;
}
public String getDate() {
return date ;
}
public void setDate(String date) {
this.date = date;
}
}
use it like this, in your activity
在你的活动中像这样使用它
ListView listMsg;
ArrayList<Msg> listMessages;
MessagesListAdapter adapter;
listMessages = new ArrayList<Msg>();
listMessages.add(new Msg(cle,email,message,attach....));
adapter = new MessagesListAdapter(this, listMessages);
listMsg.setAdapter(adapter);
Based on this http://www.androidhive.info/2014/10/android-building-group-chat-app-using-sockets-part-1/
基于这个http://www.androidhive.info/2014/10/android-building-group-chat-app-using-sockets-part-1/
screenshot http://s10.postimg.org/4f24pmp6h/Screenshot_2015_04_01_20_34_56.png
截图http://s10.postimg.org/4f24pmp6h/Screenshot_2015_04_01_20_34_56.png
回答by djhs16
I have created a library for creating chat list, this might help
我创建了一个用于创建聊天列表的库,这可能会有所帮助