Как указать разные макеты для портретной и альбомной ориентации?

142

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

Можно ли также указать разные макеты для разных размеров экрана? Если да, то как это сделать?

Джей Аскрен
источник

Ответы:

203

Создайте layout-landкаталог и поместите альбомную версию XML-файла макета в этот каталог.

Марк Б
источник
3
Означает ли это, что все действия должны определять как ландшафт, так и портрет, если я это делаю?
Джей Аскрен
20
Нет, если определения макета не существует, он просто использует макет XML в стандартном каталоге макетов.
Марк Б
в моем случае, layout-land не работает, когда я использую, android: configChanges = "direction | keyboardHidden | screenSize"
Pandey
9
Удалить ориентацию с Android: configChanges = "Ориентация | Клавиатура скрыта | Размер экрана"
Ushal Naidoo
60

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

Больше информации здесь:

http://developer.android.com/guide/practices/screens_support.html

в разделе «Спецификаторы каталога ресурсов для размера и плотности экрана»

Сильвио Доннини
источник
Работает только для ОС версии 1.6 или выше. Если вы хотите поддерживать 1.5, вам нужна эта ссылка: developer.android.com/guide/practices/screens-support-1.5.html
Скотт Биггс,
2
@Silvio Donnini - ссылки больше не содержат необходимой информации.
код
2
@itsaboutcode Да, это так: перейдите к
разделу
27

Для любителей мыши! Я говорю правой кнопкой мыши на папке ресурсов и Add new resource file, и из доступных квалификаторов выберите orientation:

введите описание изображения здесь


Но все же вы можете сделать это вручную, скажем, добавив подпапку "layout-land" в

"Your-Project-Directory \ приложение \ SRC \ главная \ Рез"

с тех пор любой файл layout.xml в этой подпапке будет автоматически работать только в ландшафтном режиме .

Используйте «layout-port» для портретного режима.

AmiNadimi
источник
1
Это сработало для меня. Я добавил новый файл макета в соответствии с инструкциями с тем же именем, что и портретная версия. Android Studio автоматически создала папку для этого макета. Один макет для портрета и другой для пейзажа. Новый макет автоматически отображается при повороте экрана.
Смитти-Вербен-Ягер-Мадженсон
23

Просто напоминание:

Удалите orientationиз android:configChangesатрибута действия в xmlфайле манифеста, если вы его определили:

android:configChanges="orientation|screenLayout|screenSize"
Робин Цю
источник
1
Что делать, если мне нужно иметь android: configChanges = "direction | screenLayout | screenSize" в моем манифесте, поскольку некоторые из моих фрагментов могут быть как в ориентации, так и в некоторых нет, но все же нужны отдельные макеты для ландшафта и портрета для тех фрагментов, которые можно динамически менять ориентацию?
Натансальда
9

Самый быстрый способ для Android Studio 3.xx и Android Studio 4.xx

1. Перейдите на вкладку дизайна макета деятельности

2.Вверху вы должны нажать на кнопку ориентации для предварительного просмотра, есть опция для создания макета ландшафта (проверьте изображение), новая папка будет создана как файл макета XML для этой конкретной ориентации.

введите описание изображения здесь

Схид
источник
4

Я думаю, что самый простой способ в последних версиях Android - перейти в режим «Дизайн» XML (не «Текст»).

Затем в меню выберите опцию - Создать альбомную вариацию. Это создаст пейзаж XML без каких-либо хлопот в течение нескольких секунд. Последняя версия Android Studio позволяет сразу создать альбомный вид.

введите описание изображения здесь

Я надеюсь, что это работает для вас.

Аканши Шривастава
источник
3

Создайте новый каталог layout-land, затем создайте xmlфайл с тем же именем, layout-landкак былоlayout каталог, и выровняйте там свой контент для ландшафтного режима.

Обратите внимание, что идентификатор контента в обоих xmlодинаков.

Нуман Шах
источник
3

Последняя строка ниже - пример применения двух квантификаторов: альбомной и наименьшей ширины экран с горизонтальной (600 dp). Обновите 600dp с теми, которые вам нужны.

res/layout/main_activity.xml                # For handsets
res/layout-land/main_activity.xml           # For handsets in landscape
res/layout-sw600dp/main_activity.xml        # For 7” tablets
res/layout-sw600dp-land/main_activity.xml   # For 7” tablets in landscape

Вышесказанное относится и к размерам

res/values/dimens.xml                # For handsets
res/values-land/dimens.xml           # For handsets in landscape
res/values-sw600dp/dimens.xml        # For 7” tablets
res/values-sw600dp-land/dimens.xml   # For 7” tablets in landscape

Полезные метрики устройства: https://material.io/tools/devices/

s-охотник
источник
2

Или используйте это:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
            android:scrollbars="vertical" 
            android:layout_height="wrap_content" 
            android:layout_width="fill_parent">

  <LinearLayout android:orientation="vertical"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

     <!-- Add your UI elements inside the inner most linear layout -->

  </LinearLayout>
</ScrollView>
великан
источник
0
  1. Щелкните правой кнопкой мыши по папке res,
  2. Новый -> Файл ресурсов Android
  3. в Доступных квалификаторах выберите Ориентация,
  4. добавить в выбранный классификатор
  5. в ориентации экрана выберите Пейзаж
  6. Нажмите ОК

Используя Android Studio 3.4.1, он больше не создает layout-landпапку . Это создаст папку и объединит два файла макета.

введите описание изображения здесь

eos1d3
источник
2
Неправильно. Вы не используете режим просмотра папок (например, «Проект»). Вероятно, вы используете режим просмотра «Android», который группирует файлы, как на скриншоте, в виртуальные папки, но фактическая структура папок по-прежнему такова, как описано в каждом другом посте.
monK_