Как разделить экран на две части в Android?

Как разделить экран на две части в Android? - коротко

Для разделения экрана на две равные части удобно использовать LinearLayout с горизонтальной ориентацией и задать каждому дочернему элементу android:layout_weight="1". Альтернативно, в ConstraintLayout разместите два View, привяжите их к противоположным сторонам родителя и установите ширину/высоту 0dp, чтобы они автоматически заполняли половины экрана.

Как разделить экран на две части в Android? - развернуто

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

Самый простой способ — использовать LinearLayout с горизонтальной ориентацией и распределить пространство при помощи свойства layout_weight. Внутри контейнера помещаются два дочерних элемента (например, FrameLayout или FragmentContainerView). Каждый из них получает вес 1, что гарантирует равное деление ширины экрана:

<LinearLayout
 android:orientation="horizontal"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <FrameLayout
 android:id="@+id/left_container"
 android:layout_width="0dp"
 android:layout_height="match_parent"
 android:layout_weight="1"/>
 <FrameLayout
 android:id="@+id/right_container"
 android:layout_width="0dp"
 android:layout_height="match_parent"
 android:layout_weight="1"/>
</LinearLayout>

Если требуется более точный контроль над позиционированием, удобно применять ConstraintLayout. Здесь можно задать вертикальный Guideline в центре экрана и привязать к нему обе части. Такой подход упрощает адаптацию к различным плотностям и ориентациям:

<androidx.constraintlayout.widget.ConstraintLayout
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <androidx.constraintlayout.widget.Guideline
 android:id="@+id/center_guideline"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:orientation="vertical"
 app:layout_constraintGuide_percent="0.5"/>
 <FrameLayout
 android:id="@+id/left_container"
 android:layout_width="0dp"
 android:layout_height="match_parent"
 app:layout_constraintStart_toStartOf="parent"
 app:layout_constraintEnd_toStartOf="@id/center_guideline"/>
 <FrameLayout
 android:id="@+id/right_container"
 android:layout_width="0dp"
 android:layout_height="match_parent"
 app:layout_constraintStart_toEndOf="@id/center_guideline"
 app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

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

supportFragmentManager.beginTransaction()
 .replace(R.id.left_container, LeftFragment())
 .replace(R.id.right_container, RightFragment())
 .commit()

Такой подход упрощает замену содержимого, поддерживает навигацию и сохраняет состояние при повороте экрана.

Если приложение должно работать как в режиме «два окна», а также поддерживать режим полной экранизации одной части, стоит рассмотреть FragmentViewModel совместно с NavController. При изменении ориентации или размера окна можно переключать видимость одного из контейнеров, оставляя второй в полноэкранном режиме.

Для устройств с большими экранами (планшеты) часто используют шаблон «two‑pane». В res/layout хранится обычный однопанельный макет, а в res/layout-sw600dp – двойной. Система автоматически подбирает нужный файл в зависимости от ширины экрана, и разработчик пишет лишь один набор фрагментов, а не два разных макета.

Иногда требуются интерактивные разделители, позволяющие пользователю изменять пропорции. В этом случае подходит androidx.slidingpanelayout.widget.SlidingPaneLayout. Он создаёт две области, где левая панель может быть «скрыта» или «раздвинута» пользователем. Пример разметки:

<androidx.slidingpanelayout.widget.SlidingPaneLayout
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <FrameLayout
 android:id="@+id/pane_left"
 android:layout_width="wrap_content"
 android:layout_height="match_parent"/>
 <FrameLayout
 android:id="@+id/pane_right"
 android:layout_width="match_parent"
 android:layout_height="match_parent"/>
</androidx.slidingpanelayout.widget.SlidingPaneLayout>

С помощью метода setPanelSlideListener можно реагировать на перемещение разделителя и сохранять выбранные пользователем пропорции в SharedPreferences.

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

Подводя итог, для статического равного деления используют LinearLayout с весами или ConstraintLayout с направляющими. Для динамического управления, сохранения состояния и гибкой замены контента предпочтительно применять фрагменты в сочетании с ConstraintLayout или SlidingPaneLayout. Выбор конкретного инструмента определяется требованиями к адаптивности, интерактивности и сложности проекта.