Перейти к основному содержимому
Версия: 5.21.0

Отображение чата

SDK предоставляет два способа отобразить чат: через ChatFragment (рекомендуется) или через встроенную ChatActivity.

Способ 1: ChatFragment (рекомендуется)

Даёт полный контроль над контейнером, навигацией и жизненным циклом.

import edna.chatcenter.core.annotation.OpenWay
import edna.chatcenter.ui.visual.fragments.ChatFragment

class MyChatActivity : AppCompatActivity() {

private val chatCenterUI: ChatCenterUI
get() = (application as MyApp).chatCenterUI

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_chat)

// getChatFragment() возвращает ранее созданный экземпляр (если он жив в памяти)
// или null. На первом открытии создайте фрагмент через ChatFragment.newInstance(...).
val chatFragment = chatCenterUI.getChatFragment()
?: ChatFragment.newInstance(OpenWay.DEFAULT)

supportFragmentManager
.beginTransaction()
.replace(R.id.chat_container, chatFragment)
.commit()
}

override fun onBackPressed() {
val chatFragment = supportFragmentManager
.findFragmentById(R.id.chat_container) as? ChatFragment
if (chatFragment != null) {
val shouldClose = chatFragment.onBackPressed()
if (shouldClose) {
finish()
}
} else {
super.onBackPressed()
}
}
}
подсказка

R.id.chat_container — контейнер FrameLayout в вашей разметке. SDK представляет собой фрагмент — вы можете самостоятельно настроить отступы контейнера.

onBackPressed deprecated (API 33+)

Метод onBackPressed() помечен как deprecated начиная с API 33 (Android 13). Метод chatFragment.onBackPressed() остаётся актуальным API для обработки навигации внутри SDK. Для современных приложений рекомендуется использовать OnBackPressedDispatcher:

onBackPressedDispatcher.addCallback(this) {
val chatFragment = supportFragmentManager
.findFragmentById(R.id.chat_container) as? ChatFragment
val shouldClose = chatFragment?.onBackPressed() ?: true
if (shouldClose) finish()
}

Способ 2: ChatActivity

Встроенная Activity SDK, уже содержащая ChatFragment и собственный layout. Не требует от приложения отдельной Activity и контейнера-разметки.

import edna.chatcenter.ui.visual.activities.ChatActivity

val intent = Intent(context, ChatActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
context.startActivity(intent)

Для получения ссылки на текущую Activity:

val activity = chatCenterUI.getChatActivity() // null, если Activity ещё не создана

Сравнение подходов

Когда что выбрать
  • ChatFragment — для production-приложений, когда нужен контроль над навигацией, Navigation Component, или встраивание чата в существующий экран
  • ChatActivity — когда чат занимает отдельный экран без кастомной навигации и встроенный layout SDK устраивает

Edge-to-edge (Android 15+)

Начиная с Android 15 (targetSdk = 35) подход edge-to-edge стал обязательным: система игнорирует android:fitsSystemWindows и контент по умолчанию рисуется под status bar и navigation bar.

SDK обрабатывает insets автоматически при targetSdk = 35: toolbar и поле ввода получают корректные WindowInsets-отступы без дополнительной настройки.

Параметр ChatFlow.fullScreenMode устарел

Свойство fullScreenMode в ChatFlow помечено @Deprecated. Согласно сообщению аннотации в коде SDK — «с момента targetSdk = 35 параметр более не используется (всегда true. Поле оставлено для бинарной совместимости; см. также Известные ограничения (раздел «Поля без эффекта в текущей версии»).

Чат в частичном контейнере (bottom sheet, drawer)

Публичного способа отключить авто-insets нет

В SDK 5.x на устройствах Android 15+ (API 35+) ChatFragment безусловно применяет WindowInsets-отступы к toolbar и нижнему layout (поле ввода). Публичного флага или escape-hatch для отключения нет.

Поле ChatFlow.fullScreenMode рантаймом SDK не читается (см. Известные ограничения, раздел «Поля без эффекта в текущей версии»). Установка fullScreenMode = false не отключит применение insets.

Что это значит для встраивания в BottomSheetDialogFragment / drawer / partial container: на устройстве с Android 15+ нижний край чата получит padding высотой с системную navigation bar даже внутри bottom sheet, что визуально выглядит как лишний отступ.

Временные обходные пути на стороне приложения (вне SDK):

  • Использовать ChatActivity с собственной темой, либо отдельный полноэкранный экран вместо bottom sheet;
  • На уровне хост-Activity управлять WindowCompat.setDecorFitsSystemWindows(window, false) и собственной темой так, чтобы чат всё-таки воспринимался как полноэкранный;
  • Дождаться публичного API для opt-out — следите за Changelog.
Перерисовка темы требует переоткрытия чата

Поля chatCenterUI.theme / darkTheme опрашиваются при каждом создании ChatFragmentonCreateView). Если изменить тему, пока чат уже открыт, текущий экран автоматически не перерисуется — закройте чат и откройте его заново, новая тема применится. Переинициализация SDK не требуется. См. также Темы.

Обработка кнопки «Назад»

SDK использует внутреннюю навигацию (поиск сообщений, просмотр изображений, выбранные сообщения, цитирование). Всегда передавайте нажатие «Назад» во ChatFragment:

Сигнатура:

fun onBackPressed(): Boolean

Возвращает:

  • true — чат готов к закрытию (никакая внутренняя навигация не была активна).
  • false — SDK обработал нажатие сам (например, закрыл поисковую строку, снял выделение сообщений, скрыл квоту); хост-экран закрывать не нужно.
val shouldClose = chatFragment.onBackPressed()
if (shouldClose) finish()