Я хотел бы, чтобы планшеты могли отображаться в книжной и альбомной ориентации (sw600dp или выше), но телефоны должны быть только в портретной ориентации. Я не могу найти способ условно выбрать ориентацию. Какие-либо предложения?
android
tablet
screen-orientation
Кенни Уайлэнд
источник
источник
layout-land
внутреннейres
папки.Ответы:
Вот хороший способ использования ресурсов и определителей размера .
Поместите этот ресурс bool в res / values как bools.xml или как угодно (имена файлов здесь не имеют значения):
Поместите это в res / values-sw600dp и res / values-xlarge:
См. Этот дополнительный ответ для помощи по добавлению этих каталогов и файлов в Android Studio.
Затем в методе onCreate ваших действий вы можете сделать это:
Устройства, которые имеют более 600 dp в направлении наименьшей ширины или x-large на устройствах до Android 3.2 (планшеты, в основном), будут вести себя как обычно, основываясь на повороте датчика и блокировки пользователя и т . Д. Все остальное (телефоны, в значительной степени) будет только портретным.
источник
xlarge
тоже нужно использовать или я могу просто использоватьsw600dp
? Вероятно, сейчас нет планшетов, работающих под <3.2.onCreate()
. Когда я переместил вызов вsetRequestedOrientation()
другую позицию по времени и контексту, перезапуск больше не происходил.Вы можете попробовать этот способ сначала получить размер экрана устройства
а затем установить ориентацию в соответствии с этим
источник
Configuration
предоставляетscreenLayout
информацию - DPI. Тогда как вопрос касается размера экрана физического устройства - телефона против планшета. Это означает, что вы можете иметьConfiguration.SCREENLAYOUT_SIZE_NORMAL
планшет MDPI.Дополнение к принятому ответу
Вы можете сделать следующие шаги в Android Studio, чтобы добавить
res/values-sw600dp
иres/values-large
каталоги с ихbools.xml
файлами.Значения-sw600dp
Прежде всего, на вкладке Project выберите фильтр Project (а не Android) в навигаторе.
Затем щелкните правой кнопкой мыши
app/src/main/res
каталог. Выберите « Создать» > « Каталог ресурсов Android». .Выберите наименьшая ширина экрана , а затем нажмите кнопку >> .
Введите
600
для наименьшей ширины экрана. Имя каталога будет создано автоматически. Скажи "ОК.Затем щелкните правой кнопкой мыши по вновь созданному
values-sw600dp
файлу. Выберите « Создать» > « Файл значений» . Типbools
имя.Значения-большие
Добавление
values-large
каталога необходимо только в том случае, если вы поддерживаете предварительную версию Android 3.2 (уровень API 13). В противном случае вы можете пропустить этот шаг.values-large
Каталог соответствуетvalues-sw600dp
. (values-xlarge
соответствуетvalues-sw720dp
.)Чтобы создать
values-large
каталог, выполните те же действия, что и выше, но в этом случае выберите Размер, а не Наименьшую ширину экрана. Выберите Большой . Имя каталога будет создано автоматически.Щелкните правой кнопкой мыши каталог, как и прежде, чтобы создать
bools.xml
файл.источник
Вот как я это сделал (вдохновлено http://androidblogger.blogspot.com/2011/08/orientation-for-both-phones-and-tablets.html ):
В AndroidManifest.xml для каждого действия вы хотите иметь возможность переключаться между портретным и ландшафтным режимом (убедитесь, что вы добавили screenSize - вам это раньше не нужно!) Вам не нужно устанавливать здесь ориентацию экрана. :
Методы, которые нужно добавить в каждое действие:
и: (если вы не переопределите этот метод, приложение вызовет onCreate () при изменении ориентации)
В onCreate () каждого действия:
Единственное, чего я не могу понять, это как заставить приложение изменять файлы макетов при переключении с альбомного на портретное и наоборот. Я предполагаю, что ответ делает нечто похожее на то, что делает приведенная выше ссылка, но я не смог заставить это работать на меня - он удалил все мои данные. Но если у вас достаточно простое приложение с одинаковым файлом макета для портретной и альбомной ориентации, это должно сработать.
источник
После ответа Джинни я думаю, что самый надежный способ сделать это заключается в следующем:
Как описано здесь , поместите логическое значение в ресурсы sw600dp. Он должен иметь префикс sw, иначе он не будет работать должным образом:
в res / values-sw600dp / dimensions.xml
в res / values / dimensions.xml
Затем создайте метод для получения этого логического значения:
И базовое действие, расширяемое от действий, в которых вы хотите это поведение:
Таким образом, каждое действие будет расширять BaseActivity:
Важно : даже если вы выходите из
BaseActivity
, вы должны добавить строкуandroid:configChanges="orientation|screenSize"
к каждомуActivity
в вашем AndroidManifest.xml:источник
Ну, это немного поздно, но вот XML-Only, но решение для взлома, которое не воссоздает действие, как
setRequestedOrientation
если бы нужно было изменить ориентацию:https://stackoverflow.com/a/27015879/1281930
источник
После принято ответа я добавляю файл kotlin с решением, надеюсь, он кому-нибудь поможет
Поместите этот ресурс bool
res/values
как bools.xml или как угодно (имена файлов здесь не важны):Поместите это
res/values-sw600dp
иres/values-sw600dp-land
:Затем добавьте его в нижних строках вашей деятельности или фрагментированности
источник
Другие решения не работали для меня. У меня все еще были странные проблемы с ориентацией на диалоги и вопросы отдыха. Мое решение состояло в том, чтобы продлить действие, сделав его портретом в манифесте.
Пример:
manifest.xml:
в заставке деятельности:
источник
Старый вопрос я знаю. Чтобы приложение всегда работало в портретном режиме, даже если ориентация может быть или поменялась местами и т. Д. (Например, на планшетах), я разработал эту функцию, которая используется для установки устройства в правильной ориентации без необходимости знать, как портрет и пейзаж функции организованы на устройстве.
Работает как шарм!
ВНИМАНИЕ: измените
this.activity
свою деятельность или добавьте ее к основной деятельности и удалитеthis.activity
;-)Если вы хотите сделать обратное, вы должны изменить код на ландшафт (но я думаю, что это понятно).
источник
К сожалению, используя метод setRequestedOrientation (...) приведет к перезапуску действия, поэтому даже если вы вызовете его в методе onCreate, он пройдет жизненный цикл действия и затем заново создаст то же действие в запрошенной ориентации. Таким образом, при ответе @Brian Christensen вы должны учитывать, что код активности может вызываться дважды, что может иметь плохие последствия (не только визуальные, но и при сетевых запросах, аналитике и т. Д.).
Более того, установка атрибута configChanges в манифесте, на мой взгляд, является большим компромиссом, который может потребовать огромных затрат на рефакторинг. Разработчики Android не рекомендуют менять этот атрибут .
Наконец, попытка установить screenOrientation как-то иначе (чтобы избежать проблемы перезапуска) невозможна, статически невозможна из-за статического манифеста, который нельзя изменить, программно можно вызвать этот метод только в уже запущенном действии.
Резюме: На мой взгляд, предложение @Brian Christensen - лучший компромисс, но имейте в виду проблему возобновления активности.
источник