【Android】聊天demo

1.主要实现功能:

①聊天界面的实现

②状态栏沉浸

③软键盘自动弹出

④发消息后ScrollView的自动滚动,并使EditText再次获取焦点


2.上个界面,看看是不是符合你的需求,符合的话继续向下看



3.主界面在MainActivity中实现

//onCreate中

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//沉浸式状态栏的实现
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);//弹出软键盘后自动重新计算布局
scrollView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {//为scrollview注册布局变化的监听事件
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                if (mHandler != null) {
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            scrollView.fullScroll(FOCUS_DOWN);//scrollView自动滑到底部
                            msg.setFocusable(true);//接下来的事情都是把焦点还给EditText
                            msg.setFocusableInTouchMode(true);
                            msg.requestFocus();
                            msg.findFocus();
                        }
                    });
                }
            }
        });

4.沉浸式状态栏的实现 

根布局重点就在于fitsSysytemWindows=“true”

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/main_color"
    android:fitsSystemWindows="true">   


5.聊天内容的分类

private class ChatMsgAdapter extends RecyclerView.Adapter<ChatMsgAdapter.ViewHolder> {

        private ArrayList<MsgChatBody> list;

        public ChatMsgAdapter(ArrayList<MsgChatBody> list) {
            this.list = list;
        }

        class ViewHolder extends RecyclerView.ViewHolder {
            public View view;
            public TextView chatMsgLeft;
            public TextView chatMsgRight;

            public ViewHolder(View itemView) {
                super(itemView);
                view = itemView;
                chatMsgLeft = view.findViewById(R.id.chat_msg_left);//左侧的布局
                chatMsgRight = view.findViewById(R.id.chat_msg_right);//右侧布局
            }
        }

        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.chat_msg_content,
                    parent, false);
            ViewHolder viewHolder = new ViewHolder(view);
            return viewHolder;
        }

        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            MsgChatBody body = list.get(position);
            if (body.type == CHAT_MSG_TYPE_LEFT) {//通过type字段判断,显示哪边的布局
                holder.chatMsgRight.setVisibility(View.GONE);
                holder.chatMsgLeft.setVisibility(VISIBLE);
                holder.chatMsgLeft.setText(body.msg);
            } else if (body.type == CHAT_MSG_TYPE_RIGHT) {
                holder.chatMsgLeft.setVisibility(View.GONE);
                holder.chatMsgRight.setVisibility(VISIBLE);
                holder.chatMsgRight.setText(body.msg);
            }
        }

        @Override
        public int getItemCount() {
            return list.size();
        }
    }

6.github地址

一个简单的聊天app界面实现

猜你喜欢

转载自blog.csdn.net/crab0314/article/details/80546268