Как разделить экран на две части в 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()
Такой подход упрощает замену содержимого, поддерживает навигацию и сохраняет состояние при повороте экрана.
Если приложение должно работать как в режиме «два окна», а также поддерживать режим полной экранизации одной части, стоит рассмотреть Fragment
‑ViewModel
совместно с 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
. Выбор конкретного инструмента определяется требованиями к адаптивности, интерактивности и сложности проекта.