Android - заблокируйте телефон в портретном режиме, но планшет может быть как альбомным, так и портретным
Я пытаюсь написать приложение, в котором я хочу, чтобы телефон был привязан к книжной ориентации, но чтобы версия для планшета имела альбомную и книжную ориентацию.
Я создал что-то, что почти работает на основе всех следующих вопросов...
Как заблокировать ориентацию экрана для телефона, а не для планшета? (Android) Как разрешить только альбомную / книжную ориентацию только для планшетов Портрет для телефона, альбомная ориентация для планшета (Android-Layout) альбомный режим только на планшете Блокировка телефона в портретном режиме
Пока что я сделал, расширил Activity в свою базовую Activity и включил код изменения ориентации как в onCreate, так и в перезаписанный onConfigurationChanged.
@Override
protected void onCreate(Bundle savedInstanceState) {
if(!(new DeviceHelper().isTablet(this)))
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
super.onCreate(savedInstanceState);
setupActionBar(getActivity());
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
//don't reload the current page when the orientation is changed
if(!(new DeviceHelper().isTablet(this)))
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
super.onConfigurationChanged(newConfig);
}
Все с этим работает нормально (я переписал onConfigurationChanged, чтобы избежать разрушения и воссоздания действия, которое приводит к появлению черного экрана на долю секунды).
Моя главная проблема в том, что если вы держите телефон в альбомной ориентации, то активность остается в портретной... идеальной! Однако, поскольку телефон находится в реальном ландшафте, то используется макет для ландшафта, который является макетом с планшета.
Насколько я понимаю, когда вызывается setRequestedOrientation, он должен немедленно запускать onConfigurationChanged, однако сначала вызывается фрагмент, затем неправильно раздувается компоновка, а затем вызывается onConfigurationChanged, что означает, что компоновка ландшафта уже установлена.
Я понимаю, что мог бы установить макет в каждом из моих действий, основываясь на конфигурации, но я действительно не хочу этого делать.
Итак, как я могу заставить приложение использовать соответствующий файл макета из соответствующей папки res, основываясь на setRequestedOrientation.
Спасибо
2 ответа
Если ваш альбомный макет предназначен только для планшетов, я бы посоветовал поместить его в папки макетов планшета, например: layout-sw600dp-land (для 7-дюймового планшета) и layout-sw720dp-land (для 10-дюймового планшета). Таким образом, макет планшета будет использоваться только в планшетах. Если вы не объявляете альбомную раскладку для телефона, он будет использовать обычную книжную раскладку. Разделение папок макетов для планшета и телефона помогает в организации.
Все с этим работает нормально (я переписал onConfigurationChanged, чтобы избежать разрушения и воссоздания действия, которое приводит к появлению черного экрана на долю секунды).
Я уверен, что это корень вашей проблемы. Вы должны быть в состоянии выполнить то, что вы пытаетесь сделать, не переопределяя onConfigurationChanged
, Позвольте ОС обработать изменения конфигурации и предоставьте правильные файлы макета.
Если вы делаете это, вы должны быть хороши на планшетах. Они не должны устанавливать определенную ориентацию, и они должны открывать правильную ориентацию для каждого Действия. Телефонные устройства будут иметь проблему, о которой вы говорите, с быстрым черным экраном. Происходит следующее: сначала действие открывается в той ориентации, в которой находится телефон, скажем, "Пейзаж". Затем он установит свою ориентацию на "Портрет" в коде и подвергнется изменению конфигурации, воссоздав действие и вызвав мгновенную вспышку, которую вы видите.
Есть способы, которыми вы можете смягчить это.
использование
android:screenOrientation="behind"
вAndroidManifest.xml
для каждого вида деятельности. Это запустит действие в той ориентации, в которой было предыдущее действие (портрет для телефонов, что угодно для планшетов). Тогда вам никогда не придется беспокоиться о том, что Activity будет создана дважды, потому что она всегда будет начинаться с правильной ориентации.Это не исправит вашу самую первую активность, однако. Вы можете иметь дело с активностью запуска, имеющей эту вспышку ровно один раз при запуске приложения, или вы можете установить активность запуска на
android:screenOrientation="portrait"
в манифесте и не забудьте установить таблеткиsetRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
в коде. Это может привести к возникновению этой вспышки при запуске планшетов.
Использование только первой маркированной точки должно быть достаточно хорошим, но вы должны адаптировать свою реализацию к требованиям пользовательского интерфейса вашего приложения.