Стратегия миграции

Если у вас есть существующее приложение на основе View, вам, возможно, не захочется переписывать весь его пользовательский интерфейс сразу. Эта страница поможет вам добавить новые компоненты Compose в ваше существующее приложение. Чтобы начать использовать Compose в вашем приложении, см. Настройка Compose для существующего приложения .

Jetpack Compose изначально был разработан с учетом совместимости с View. Эта функциональность означает, что вы можете перенести свое существующее приложение на основе View в Compose, сохраняя при этом возможность создания новых функций. Для перехода на Compose мы рекомендуем поэтапную миграцию, при которой Compose и Views будут сосуществовать в вашей кодовой базе, пока ваше приложение не будет полностью переведено в Compose.

Этапы миграции приложения на основе View в Compose
Рисунок 1. Этапы миграции приложения View-based на Compose

Чтобы перенести приложение в Compose, выполните следующие действия:

  1. Создавайте новые экраны с помощью Compose.
  2. При создании функций определите повторно используемые элементы и начните создавать библиотеку общих компонентов пользовательского интерфейса.
  3. Заменяйте существующие функции по одному экрану за раз.

Создавайте новые экраны с помощью Compose

Использование Compose для создания новых функций, охватывающих весь экран, — лучший способ стимулировать внедрение Compose. С помощью этой стратегии вы можете добавлять функции и использовать преимущества Compose , при этом продолжая удовлетворять бизнес-потребности вашей компании.

Новый экран, написанный в Compose
Рисунок 2. Новый экран, написанный в Compose

Когда вы используете Compose для создания новых экранов в вашем существующем приложении, вы все еще работаете в рамках ограничений архитектуры вашего приложения. Если вы используете Fragments и компонент Navigation, то вам придется создать новый Fragment и разместить его содержимое в Compose.

Чтобы использовать Compose во фрагменте, верните ComposeView в методе жизненного цикла onCreateView() вашего фрагмента. ComposeView имеет метод setContent() , в котором вы можете предоставить компонуемую функцию.

class NewFeatureFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        return ComposeView(requireContext()).apply {
            setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
            setContent {
                NewFeatureScreen()
            }
        }
    }
}

Подробнее см. ComposeView в Fragments .

Добавить новые функции на существующие экраны

Существующий экран со смешанными представлениями и созданием сообщения
Рисунок 3. Существующий экран со смешанными представлениями и созданием сообщения

Вы также можете использовать Compose в существующем экране на основе View, если новая функция, которую вы добавляете, является частью существующего экрана. Для этого добавьте ComposeView в иерархию View, как и любой другой View.

Например, предположим, что вы хотите добавить дочернее представление к LinearLayout . Вы можете сделать это в XML следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <TextView
      android:id="@+id/text"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" />

  <androidx.compose.ui.platform.ComposeView
      android:id="@+id/compose_view"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />
</LinearLayout>

После того, как представление будет заполнено, вы сможете позже сослаться на ComposeView в иерархии и вызвать setContent() .

Чтобы узнать больше о ComposeView , ознакомьтесь с разделом API взаимодействия .

Создайте библиотеку общих компонентов пользовательского интерфейса

При создании функций с помощью Compose вы быстро поймете, что в конечном итоге создаете библиотеку компонентов. Создание библиотеки общих компонентов пользовательского интерфейса позволяет вам иметь единый источник истины для этих компонентов в вашем приложении и способствовать повторному использованию. Функции, которые вы создаете, затем могут зависеть от этой библиотеки. Этот метод особенно полезен, если вы создаете индивидуальную систему проектирования в Compose .

В зависимости от размера вашего приложения эта библиотека может быть отдельным пакетом, модулем или модулем библиотеки. Для получения дополнительной информации об организации модулей в вашем приложении ознакомьтесь с Руководством по модуляризации приложений Android .

Заменить существующие функции на Compose

Помимо использования Compose для создания новых функций, вам необходимо постепенно переносить существующие функции в свое приложение, чтобы воспользоваться преимуществами Compose.

Если ваше приложение будет Compose-only, это может ускорить вашу разработку, а также уменьшить размер APK и время сборки вашего приложения. См. Сравнение производительности Compose и View, чтобы узнать больше.

Простые экраны

Первое, на что следует обратить внимание при миграции существующих функций в Compose, — это простые экраны. Простые экраны могут быть экраном приветствия, экраном подтверждения или экраном настроек, где данные, отображаемые в пользовательском интерфейсе, относительно статичны.

Возьмем следующий XML-файл:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <TextView
      android:id="@+id/title_text"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/title"
      android:textAppearance="?attr/textAppearanceHeadline2" />

  <TextView
      android:id="@+id/subtitle_text"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="@string/subtitle"
      android:textAppearance="?attr/textAppearanceHeadline6" />

  <TextView
      android:id="@+id/body_text"
      android:layout_width="wrap_content"
      android:layout_height="0dp"
      android:layout_weight="1"
      android:text="@string/body"
      android:textAppearance="?attr/textAppearanceBody1" />

  <Button
      android:id="@+id/confirm_button"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="@string/confirm"/>
</LinearLayout>

XML-файл можно переписать в Compose в несколько строк:

@Composable
fun SimpleScreen() {
    Column(Modifier.fillMaxSize()) {
        Text(
            text = stringResource(R.string.title),
            style = MaterialTheme.typography.headlineMedium
        )
        Text(
            text = stringResource(R.string.subtitle),
            style = MaterialTheme.typography.headlineSmall
        )
        Text(
            text = stringResource(R.string.body),
            style = MaterialTheme.typography.bodyMedium
        )
        Spacer(modifier = Modifier.weight(1f))
        Button(onClick = { /* Handle click */ }, Modifier.fillMaxWidth()) {
            Text(text = stringResource(R.string.confirm))
        }
    }
}

Смешанный вид и экраны создания сообщений

Экран, который уже содержит немного кода Compose, является еще одним хорошим кандидатом для полной миграции в Compose. В зависимости от сложности экрана вы можете либо полностью перенести его в Compose, либо сделать это по частям. Если экран начинался с Compose в поддереве иерархии пользовательского интерфейса, вы продолжите перенос элементов пользовательского интерфейса, пока весь экран не окажется в Compose. Этот подход также называется подходом снизу вверх .

Подход «снизу вверх» для миграции смешанных Views и Compose UI в Compose
Рисунок 4. Подход «снизу вверх» к миграции смешанных Views и Compose UI в Compose

Удаление фрагментов и компонента навигации

Вы можете перейти на Navigation Compose, как только сможете удалить все свои фрагменты и заменить их соответствующими компонуемыми объектами на уровне экрана. Компонуемые объекты на уровне экрана могут содержать смесь содержимого Compose и View , но все пункты назначения навигации должны быть компонуемыми объектами для включения миграции Navigation Compose. До тех пор вам следует продолжать использовать компонент навигации на основе фрагментов в вашей смешанной кодовой базе View и Compose. Подробнее см. в разделе Миграция навигации Jetpack в Navigation Compose .

Дополнительные ресурсы

Ознакомьтесь со следующими дополнительными ресурсами, чтобы узнать больше о миграции вашего существующего приложения на основе View в Compose:

Следующие шаги

Теперь, когда вы знаете стратегию, которую можно использовать для миграции существующего приложения на основе View, изучите API взаимодействия , чтобы узнать больше.

{% дословно %} {% endverbatim %} {% дословно %} {% endverbatim %}