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); в коде. Это может привести к возникновению этой вспышки при запуске планшетов.

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

Другие вопросы по тегам