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地址