一个聊天界面

目录

布局

    先写一个布局,包含一个自定义的菜单,ListView用于显示聊天信息,底部布局左边的imageview用于选择表情,图片,中间输入框,右边发送按钮。
    再写放在ListView中的子布局

这里写图片描述

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/friend"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_marginBottom="1dp"
        android:text="不要回我省略号"
        android:textSize="24sp"
        android:background="#88000088"
        />

    <ListView
        android:id="@+id/list_chat"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:divider="#00000000"
        android:background="@mipmap/chatbackground"
        >

    </ListView>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:orientation="horizontal"
        android:gravity="bottom"
        android:background="#345678"
        >
        <ImageView
            android:id="@+id/image_face"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="2dp"
            android:background="@mipmap/dga"
            />
        <EditText
            android:id="@+id/edit_message"
            android:layout_width="0dp"
            android:layout_height="50dp"
            android:layout_weight="1"
            android:maxLines="4"
            android:layout_marginRight="2dp"
            android:background="@drawable/edit_background"
            />
        <Button
            android:id="@+id/button_send"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:layout_marginRight="5dp"
            android:text="发送"
            android:background="@drawable/button_background_right"
            />
    </LinearLayout>
</LinearLayout>

//
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="2dp"
    style="@style/NoBackground"
    >

    <LinearLayout
        android:id="@+id/layout_left"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:layout_marginRight="60dp"
        android:orientation="vertical"
        >
        <ImageView
            android:id="@+id/left_face"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:scaleType="fitXY"
            android:src="@mipmap/messi"
            />
        <TextView
            android:id="@+id/message_left"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@mipmap/eng"
            android:layout_marginLeft="30dp"
            android:textColor="#000000"
            style="@style/NoBackground"
            />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/layout_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_marginTop="5dp"
        android:layout_marginLeft="60dp"
        android:orientation="vertical"
        >
        <ImageView
            android:id="@+id/right_face"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:scaleType="fitXY"
            android:layout_gravity="right"
            android:src="@mipmap/zhaoliying"
            />
        <TextView
            android:id="@+id/message_right"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@mipmap/kap"
            android:layout_marginRight="30dp"
            android:textColor="@color/white"
            style="@style/NoBackground"
            />
    </LinearLayout>
</LinearLayout>

活动

    大概就是这样,还有一个用PopUpWindow弹出GridView布局的表情没有写好
package com.example.linj.myfirstapplication;

import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.text.Spanned;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.example.linj.myfirstapplication.adapter.ChatAdapter;
import com.example.linj.myfirstapplication.adapter.FaceAdapter;
import com.example.linj.myfirstapplication.modle.Face;
import com.example.linj.myfirstapplication.modle.Message;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2015/8/27.
 */
public class ChatActivity extends Activity implements View.OnClickListener{

    private ListView mListView;
    private EditText mEditText;
    private Button mButtonSend;
    private ImageView mButtonFace;
    private List<Message> messages = new ArrayList<>();
    private ChatAdapter chatAdapter;
    private LayoutInflater inflater;
    private Spanned spanned;
    private int imageId;
    private int headId;
    private String name;
    private TextView textView;

    private List<Face> faces;
    private LayoutInflater layoutInflater;
    private FaceAdapter faceAdapter;
    private GridView mGridView;
    private int faceId;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.chat_layout);
        Intent intent1 = getIntent();
        name = intent1.getStringExtra("name");
        textView = (TextView) findViewById(R.id.friend);
        textView.setText(name);
        headId = intent1.getIntExtra("head", R.mipmap.messi);
        mListView = (ListView) findViewById(R.id.list_chat);
        mEditText = (EditText) findViewById(R.id.edit_message);
        mButtonSend = (Button) findViewById(R.id.button_send);
        mButtonSend.setOnClickListener(this);
        mButtonFace = (ImageView) findViewById(R.id.image_face);
        mButtonFace.setOnClickListener(this);
        inflater = getLayoutInflater();

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.image_face:
                Intent intent = new Intent(ChatActivity.this, FaceActivity.class);
                startActivityForResult(intent, 5);

//                setContentView(R.layout.grid_layout);
//                mGridView = (GridView) findViewById(R.id.grid_view_test);
//                layoutInflater = getLayoutInflater();
//                initFace();
//                faceAdapter = new FaceAdapter(faces,layoutInflater);
//                mGridView.setAdapter(faceAdapter);
//                mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
//                    @Override
//                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//                        faceId = faces.get(position).getFaceId();
//                        spanned = Html.fromHtml("<img src = ''/>", new Html.ImageGetter() {
//                            @Override
//                            public Drawable getDrawable(String source) {
//                                Drawable drawable = getResources().getDrawable(faceId);
//                                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
//                                return drawable;
//                            }
//                        }, null);
//                        mEditText.getText().insert(mEditText.getSelectionStart(), spanned);
//                    }
//                });
//
//                PopupWindow popupWindow = new PopupWindow(ChatActivity.this);
//                View popView = layoutInflater.inflate(R.layout.grid_layout, null);
//                popupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);
//                popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
//                popupWindow.setContentView(popView);
//                popupWindow.setOutsideTouchable(true);
//                popupWindow.showAtLocation(v, Gravity.LEFT, 0, 300);
                break;
            case R.id.button_send:
                spanned = mEditText.getText();
                Message message = new Message(spanned,0,R.mipmap.zhaoliying);
                Spanned receiver = Html.fromHtml("..............");
                Message message1 = new Message(receiver,1, headId);
                messages.add(message);
                messages.add(message1);
                chatAdapter = new ChatAdapter(inflater,messages);
                mListView.setAdapter(chatAdapter);
                chatAdapter.notifyDataSetChanged();
                mListView.setSelection(messages.size());
                mEditText.setText("");
                break;
            default:
                break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (requestCode){
            case 5:
                if (resultCode == RESULT_OK){
                    imageId = data.getIntExtra("face", R.mipmap.flag);
                    spanned = Html.fromHtml("<img src = ''/>", new Html.ImageGetter() {
                        @Override
                        public Drawable getDrawable(String source) {
                            Drawable drawable = getResources().getDrawable(imageId);
                            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                            return drawable;
                        }
                    }, null);
                    mEditText.getText().insert(mEditText.getSelectionStart(), spanned);
                }
                break;
            default:
                break;
        }
    }
    public int getHeadId() {
        return headId;
    }

    private void initFace() {
        faces = new ArrayList<>();
        Face face1 = new Face(R.mipmap.ebg);
        faces.add(face1);
        Face face2 = new Face(R.mipmap.eca);
        faces.add(face2);
        Face face3 = new Face(R.mipmap.biaoqing);
        faces.add(face3);
        Face face4 = new Face(R.mipmap.dga);
        faces.add(face4);
        Face face5 = new Face(R.mipmap.ecb);
        faces.add(face5);
        Face face6 = new Face(R.mipmap.ecw);
        faces.add(face6);
        Face face7 = new Face(R.mipmap.ecz);
        faces.add(face7);
        Face face8 = new Face(R.mipmap.ecy);
        faces.add(face8);
        Face face9 = new Face(R.mipmap.edd);
        faces.add(face9);
        Face face10 = new Face(R.mipmap.edj);
        faces.add(face10);
        Face face11 = new Face(R.mipmap.edq);
        faces.add(face11);
        Face face12 = new Face(R.mipmap.ecs);
        faces.add(face12);
        Face face13 = new Face(R.mipmap.ecn);
        faces.add(face13);
        Face face14 = new Face(R.mipmap.eco);
        faces.add(face14);
        Face face15 = new Face(R.mipmap.ecc);
        faces.add(face15);
    }
}

适配器

继承自BaseAdapter,注意getView()方法的写法,用缓存器缓存布局

package com.example.linj.myfirstapplication.adapter;

import android.content.Intent;
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.TextView;

import com.example.linj.myfirstapplication.ChatActivity;
import com.example.linj.myfirstapplication.R;
import com.example.linj.myfirstapplication.modle.Message;

import java.util.List;

/**
 * Created by Administrator on 2015/8/27.
 */
public class ChatAdapter extends BaseAdapter {

    private LayoutInflater inflater;
    private List<Message> messages;

    public ChatAdapter(LayoutInflater inflater, List<Message> messages) {
        this.inflater = inflater;
        this.messages = messages;
    }

    @Override
    public int getCount() {
        return messages.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) {
        ViewHolder viewHolder = null;
        if (convertView == null){
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.chat_message_layout, null);
            viewHolder.leftLayout = (LinearLayout) convertView.findViewById(R.id.layout_left);
            viewHolder.rightLayout = (LinearLayout) convertView.findViewById(R.id.layout_right);
            viewHolder.textViewLeft = (TextView) convertView.findViewById(R.id.message_left);
            viewHolder.textViewRight = (TextView) convertView.findViewById(R.id.message_right);
            viewHolder.imageViewLeft = (ImageView) convertView.findViewById(R.id.left_face);
            viewHolder.imageViewRight = (ImageView) convertView.findViewById(R.id.right_face);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        Message message = messages.get(position);
        if (message.getType()==0){
            viewHolder.rightLayout.setVisibility(View.VISIBLE);
            viewHolder.leftLayout.setVisibility(View.GONE);
            viewHolder.textViewRight.setText(message.getMessage());
            viewHolder.imageViewLeft.setImageResource(message.getFaceId());
        } else if (message.getType()==1){
            viewHolder.leftLayout.setVisibility(View.VISIBLE);
            viewHolder.rightLayout.setVisibility(View.GONE);
            viewHolder.textViewLeft.setText(message.getMessage());
            viewHolder.imageViewLeft.setImageResource(message.getFaceId());
        }
        notifyDataSetChanged();
        return convertView;
    }

    class ViewHolder{
        LinearLayout leftLayout;
        LinearLayout rightLayout;
        TextView textViewLeft;
        TextView textViewRight;
        ImageView imageViewLeft;
        ImageView imageViewRight;
    }
}

model

消息的实体,写的不好

package com.example.linj.myfirstapplication.modle;

import android.text.Spanned;

/**
 * Created by Administrator on 2015/8/27.
 */
public class Message {
    private Spanned message;
    private int type;
    private int faceId;

    public Message(Spanned message, int type, int faceId) {
        this.message = message;
        this.type = type;
        this.faceId = faceId;
    }

    public Spanned getMessage() {
        return message;
    }

    public void setMessage(Spanned message) {
        this.message = message;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public int getFaceId() {
        return faceId;
    }

    public void setFaceId(int faceId) {
        this.faceId = faceId;
    }
}

界面

这里写图片描述

总结

我不想总结,因为巨丑无比,还有很多不完善的,毕竟初学,还没有学完,继续努力,加油!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值