Страницы

Поиск по вопросам

вторник, 25 декабря 2018 г.

Можно ли каким-либо способом запретить смену ориентации для устройства определённого размера (small, normal)?

Доброго времени суток!
Моё приложение состоит из одного функционального Activity, в котором смена контента заключается в смене Fragment-ов. В Layout-файле самого Activity почти ничего нет (Toolbar, иконка загрузки, FAB), все основные элементы располагаются в Layout-ах фрагментов. Теперь непосредственно вопрос. Можно ли как-то сделать так, чтобы:
На устройствах одного размера (в моём случаи small и normal) смена ориентации была запрещена (точнее, разрешена только портретная)... ...но при этом на устройствах другого размера (large и xlarge) смена ориентации была разрешена? Или, как вариант, разрешена только land ориентация.
Способ подойдёт любой, хотя желательно, конечно, декларативный (через манифест или файлы проекта). Ну и желательно без костылей по-типу "программная смена ориентации в OnCreate при обнаружении устройства какого-то размера".


Ответ

Вариант с setRequestedOrientation в onCreate имеет один неприятный эффект. Если пользователь держал устройство в ориентации которую вы хотите запретить, то при запуске приложения не смотря на вызов setRequestedOrientation на короткое время успеет создастся активити с лайаутом для тукущей, а не нужной конфигурацией и если у вас он сильно отличается между конфигурациями и вы начнете работать с ним как с правильным лайаутом, то возможно словите краш. Ну и даже без краша будет визуально некрасиво что сначала приложение покажется в текущей ориентации и тут же перевернется в правильную.
Через манифест к сожалению не сделать разные ориентации для разных типов устройств, но можно немного схитрить. Можно унаследовать от вашей основной активити (будем звать её BaseMainActivity) две другие (назовем их PhoneMainActivity и TabletMainActivity), в которых ничего нового делать не будем, они нужны только для того что бы в манифесте прописать для них разные ориентации. Так же нам понадобиться отдельная активит с которой приложение будет запускаться (назовем её SplashActivity), на ней можно какуюнить загрузочную картинку показывать, или закрывать сразу в onCreate, главное что в ней нужно сделать это проверить тип устройства и в зависимости от него запустить PhoneMainActivity или TabletMainActivity.

Комментариев нет:

Отправить комментарий