使用环境:在获取会话列表之后,就可以收集到两个数据,聊天的类型和聊天的对象。
携带这两个参数跳转到聊天的ChatActivity之后,这哥Activity中就布局只是设置了一个占位FrameLayout,替换了一个Fragment ::chatFragment
ChatFragment,是聊天的重中之重。
本篇主要就是我针对聊天对话页面ChatFragment的理解,如有失误纯属巧合。
1 chatFragment extends EaseChatFragment -----> extends EaseBasrFragment
从这里就可以看出,集成了EaseUI库的方便,什么方法直接去调就可以了。而在这里我是集成的SDK,所以很多方法就是自己找到方法之后复制的。没什么用。
在父类EaseBaseFragment中知道:
a: 在OnActivityCreated()方法中添加了一个titleBar头布局到显示这哥继承了EaseBaseFragment的activity
b: 在onActivityCreated()方法中调用了两个方法initView() 和 setUpView()
别的看不懂。
在EaseChatFragment中得知:依赖EaseUI真是好! 很多页面都是已经写好的。
2 在ChatFragment中对于各种方法的理解
260行
@Override public void onEnterToChatDetails() { if (chatType == Constant.CHATTYPE_GROUP) { //1 获取群组聊天的对象 EMGroup group = EMClient.getInstance().groupManager().getGroup(toChatUsername); if (group == null) { // 2 对这个对象进行判断,如果这个聊天对象是空的,就谈吐司说明这个群组不存在。 Toast.makeText(getActivity(), R.string.gorup_not_found, Toast.LENGTH_SHORT).show(); return; } // 3 如果群组不为空,就跳转到GroupDetailsActivity界面, // 并携带参数groupid,就是群组的名称, // 还有一个参数REQUEST_CODE_GROUP_DETAIL,== 13 ; startActivityForResult( (new Intent(getActivity(), GroupDetailsActivity.class).putExtra("groupId", toChatUsername)), REQUEST_CODE_GROUP_DETAIL); }else if(chatType == Constant.CHATTYPE_CHATROOM){ //4 如果聊天类型是聊天室,就跳转到ChatRoomDetailsActivity界面,并携带roomId就是聊天室的名称 startActivityForResult(new Intent(getActivity(), ChatRoomDetailsActivity.class).putExtra("roomId", toChatUsername), REQUEST_CODE_GROUP_DETAIL); } }
而这里的chatType怎么来的,在
@Override public void onActivityCreated(Bundle savedInstanceState) { fragmentArgs = getArguments(); // check if single chat or group chat chatType = fragmentArgs.getInt(EaseConstant.EXTRA_CHAT_TYPE, EaseConstant.CHATTYPE_SINGLE); // userId you are chat with or group id toChatUsername = fragmentArgs.getString(EaseConstant.EXTRA_USER_ID); super.onActivityCreated(savedInstanceState); }
发现这个是从fragmentArgs中get出来的,前面的参数意思是聊天类型是chatType类型,前边判断过如果是聊天室就传递一个,是群组聊天就传递一个值;第二个参数是如果前面的值是没有的,就默认返回第二个参数,第二个参数的意思是单聊模式的chatType.
另外获取了聊天对象的名称toChatUsername;
注意: 这里的fragmentArgs是一个Bundle 类型的对象。
他的由来是3;
3 因为在chatActivity 中,activity接受到了intent传递过来的数据之后调用了chatFragment的一个方法,所以尽管chatFragment中代码众多,先从这哥方法入手。
toChatUsername = getIntent().getExtras().getString("userId"); //use EaseChatFratFragment chatFragment = new ChatFragment(); //pass parameters to chat fragment //将聊天对象传递到chatFragment中 chatFragment.setArguments(getIntent().getExtras()); getSupportFragmentManager().beginTransaction().add(R.id.container, chatFragment).commit();setArguments();
这里传递的是什么我不知道,或许后边会知道。但是在跳转到ChatActivity()的时候,从获取的会话列表中得到了两个数据,会话的chat_type 和 会话的userId。
如果是聊天类型chat_type是聊天室类型就做个判断:
是聊天室 就传递3,是群聊就传递2,如果是单聊就传递1 或者不用传递,这个是需要自己判断。
而userId,就是会话列表的名字。username;
4 在猜测到这个方法传递的数据以后,到chatFragment中的
onActivityCreated()
方法中得到了传递进来的聊天类型和聊天对象 的名称。
这里的线索就是chatType
5 首先找最简单的单聊界面。
而且,从单聊的文字聊天开始做。
做一个工作计划:
先做聊天文字聊天,以及相关的监听等。
在将文字聊天的方法抽出来单独的做成一个类,然后调用文字发送的方法发送成功。
语音聊天信息传递,成功了以后做成工具方法抽取出来,并测试调用工具类发送语音成功。
最后在做是视频,发送共享位置,图片等。
回归正题:
单聊文字聊天
5.1 文字聊天的布局:
在聊天的界面是一个ListView展示信息,展示信息就需要用到Adapter,这个信息ListView的Adapter就是EaseMessageAdapter,在这个Adapter类中提及了不同类型信息的创建方法:
文字信息分大信息 :EaseChatRowBigExpression
文字信息小信息: EaseChatRowText
位置信息: EaseChatRowLocation
文件信息:EaseChatRowFile
图片信息:EaseChatRowImage
声音信息:EaseChatRowVoice
视频信息:EaseChatRowVideo
在每个条目中需要设置点击事件,就是说如果点击了聊天信息数据列表中的个人头像需要跳转到这个人的个人信息页面,然后这个页面需要显示下是否添加这个人为好友。
在Adapter赋值的时候设置点击事件。这只是个猜想,明天再说吧!
在环信demo中
EMConverstaion 得到EMMessage 的方法:
*/EMConversation mConversation mConversation = EMClient.getInstance().chatManager().getConversation(toChatUsername, null, true); // 设置当前会话未读数为 0 mConversation.markAllMessagesAsRead(); int count = mConversation.getAllMessages().size();
获取最后一天信息的方法
EMMessage message = mConversation.getLastMessage(); EMTextMessageBody body = (EMTextMessageBody) message.getBody();
获取信息列表的方法
先获取会话:EMClient.getInstance().chatManager().getConversation();
List
在EMConversation中获取所有信息地方法:
public ListgetAllMessages() { if(this.getCache().isEmpty()) { EMAMessage var1 = this.emaObject.latestMessage(); ArrayList var2 = new ArrayList(); if(var1 != null) { var2.add(new EMMessage(var1)); } this.getCache().addMessages(var2); } return this.getCache().getAllMessages(); }
从EMMessage 获取信息的方法:
EMMessage message = mConversation.getLastMessage(); EMTextMessageBody body = (EMTextMessageBody) message.getBody(); String info = body.getMessage();
看到这里,简单的文字会话已经没什么问题了。
剩下 的以后再说……