会话页面
会话页面即应用程序中的聊天页面,主要由消息列表和输入区两部分组成。IMKit 提供默认的会话页面 Activity 类和基于 Fragment 类实现的会话页面。
- 基于 Activity:IMKit SDK 提供了默认会话页面
RongConversationActivity
。页面包含标题栏、消息列表和输入区域。在会话列表页点击某条会话时,会跳转到对应的会话页面。应用程序可以直接使用RongConversationActivity
或通过继承创建自定义的会话 Activity。 - 基于 Fragment:您可以在应用 Activity 中集成 IMKit 提供的会话 Fragment。
聊天界面
聊天界面一般由三个部分组成:标题栏、消息列表、输入区域。
IMKit 在默认会话页面 Activity(RongConversationActivity
)包含了标题栏的实现。如果基于 Fragment 构建会话页面,请自行实现标题栏。
标题栏
IMKit 仅在默认的会话页面 RongConversationActivity
中实现了会话页面标题栏。标题栏用于显示会话的标题,该标题可以是群组名称,也可以是一对一聊天中另一个用户的名称。在单聊会话中,标题栏可显示对方的输入状态。标题栏的视图是在 TitleBar
中创建和控制的。
标题栏提供两个按钮,一个位于组件的左侧,另一个位于组件的右上角。当点击左按钮时,会调用 Activity 的 finish()
方法来退出当前屏幕。右侧菜单按钮默认不展示。在通过继承 RongConversationActivity
创建的子类中,您可以通过 mTitleBar
的 setRightVisible
方法展示右侧按钮,通过 setOnRightIconClickListener
设置监听器,在用户点击右侧按钮后跳转到您自行实现的页面或进行其他自定义操作。
如果您使用 ConversationFragment
构建自己的会话页面,则默认不包含标题栏。您可以参考 IMKit 的标题栏组件自行实现标题栏,详见 TitleBar.java。
消息列表
消息列表组件按时间顺序显示所有消息的列表。当前用户发送的消息与其他成员发送的消息区分显示。消息列表的视图是在 BaseMessageItemProvider
和各类型消息的展示模板中创建和自定义的。您还可以使用 MessageListAdapter
自定义列表视图中的每个项目。
输入区域
消息输入组件是用户可以输入文本、文件、语音、图像、视频等消息的地方。输入区域的视图是在 RongExtension
中统一控制的。
用法
IMKit 提供了 Activity 和 Fragment 来创建会话页面。RongConversationActivity
是默认提供的会话页面,在会话列表页点击某条会话时,会跳转到对应的会话页面。您可以根据需要,选择直接使用默认 的会话页面 Activity,继承 RongConversationActivity
,或者使用 ConversationFragment
构建自定义会话 Activity。
启动会话页面
启动会话页面 Activity 有两种方式:通过调用 SDK 内置的 Activity 路由器启动,或通过 intent 跳转。您也可以自定义会话页启动方式,实现从应用的其它 Activity 启动会话页面。
IMKit 中默认已实现了会话页跳转逻辑。默认情况下,点击会话列表页的会话项目后,SDK 将自动跳转到 RongConversationActivity
,应用层无需处理。
使用 RouteUtils
RouteUtils
是 IMKit 内置的 Activity 路由器,封装了 SDK 内部各页面跳转方法,可避免应用程序进行重复的 intent 封装。
如果您构建了自定义的会话 Activity,必须先向 RouteUtils
注册自定义 Activity,才能通过这种方式跳转到自定义会话 Activity,否则跳转的是 SDK 默认的 RongConversationActivity
。
跳转到会话 Activity:
String targetId = "userId";
ConversationIdentifier conversationIdentifier = new ConversationIdentifier(Conversation.ConversationType.PRIVATE, targetId);
RouteUtils.routeToConversationActivity(context, conversationIdentifier, false, bundle)
参数 | 类型 | 说明 |
---|---|---|
context | Context | Activity 上下文 |
conversationIdentifier | ConversationIdentifier | 会话类型 |
disableSystemEmoji | Boolean | 是否隐藏 SDK 内置 Emoji 表情。true 为隐藏,false 为不隐藏。 |
bundle | Bundle | 扩展参数 |
通过 intent 跳转
您可以自己组装 Intent, 使用 Android 默认机制进行跳转。
Intent intent = new Intent(context, ConversationActivity.class);
intent.putExtra(RouteUtils.CONVERSATION_TYPE, type.getName().toLowerCase());
intent.putExtra(RouteUtils.TARGET_ID, targetId);
intent.putExtra(RouteUtils.DISABLE_SYSTEM_EMOJI, false);
intent.putExtras(bundle);
context.startActivity(intent);
继承默认会话页面 Activity
您可以通过继承 RongConversationActivity
创建自定义会话 Activity,实现对会话页面的调整。注意,必须向 RouteUtils
注册自定义的会话 Activity。注册之后,自定义的会话 Activity 将替换 IMKit 默认的会话 Activity。替换完成后,当在会话列表页点击会话时,SDK 会跳转到您注册的自定义会话 Activity。注册方法在应用生命周期内、主进程中调用一次即可。
RouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationActivity, MyConversationActivity.class)
使用 Fragment 构建自定义会话 Activity
为方便应用程序自定 义会话页面,推荐您继承使用会话 Fragment 类 ConversationFragment
构建自定义的会话 Activity。您需要将自定义会话 Activity 注册到 IMKit SDK 中,以替换 IMKit 默认的会话 Activity。
-
您可以在应用 Activity 中集成 IMKit 提供的会话 Fragment。以下示例声明一个新的
MyConversationActivity
。xml<activity
android:name="xxx.xxx.MyConversationActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize">
</activity> -
实现 Activity 布局。此处以
activity_conversation.xml
为例。xml<?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">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout> -
通过继承 IMKit 的
ConversationFragment
创建子类,在MyConversationActivity
的onCreate()
方法中使用您自定义的会话 Fragment 子类。Javaclass MyConversationActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_conversation);
// 使用 ConversationFragment 的子类添加会话界面
ConversationFragment conversationFragment = new AppConversationFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.replace(R.id.container, conversationFragment);
transaction.commit();
}
} -
向
RouteUtils
注册自定义的会话 Activity,以替换 IMKit 默认的会话 Activity。替换完成后,当在会话列表页点击会话时,SDK 会跳转到您注册的自定义会话 Activity。注册方法在应用生命周期内、主进程中调用一次即可。JavaRouteUtils.registerActivity(RouteUtils.RongActivityType.ConversationActivity, MyConversationActivity.class)
定制化
您可以通过修改 IMKit 全局配置和重写 RongConversationActivity
或 ConversationFragment
的方法来自定义聊天页面。
在开始定制化之前,建议您首先继承 SDK 内置会话页面 RongConversationActivity
或继承使用 ConversationFragment
,创建并实现自己的会话页面 Activity。
会话页面中部分样式与行为受 IMKit 全局配置影响。如需了解全局配置,参见 [配置指南]。