Страницы

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

вторник, 31 декабря 2019 г.

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

#android #android_sdk #android_layout


Доброго времени суток!

Моё приложение состоит из одного функционального Activity, в котором смена контента
заключается в смене Fragment-ов. В Layout-файле самого Activity почти ничего нет (Toolbar,
иконка загрузки, FAB), все основные элементы располагаются в Layout-ах фрагментов. 
Теперь непосредственно вопрос. Можно ли как-то сделать так, чтобы:


На устройствах одного размера (в моём случаи small и normal) смена ориентации была
запрещена (точнее, разрешена только портретная)...
...но при этом на устройствах другого размера (large и xlarge) смена ориентации была
разрешена? Или, как вариант, разрешена только land ориентация.


Способ подойдёт любой, хотя желательно, конечно, декларативный (через манифест или
файлы проекта). Ну и желательно без костылей по-типу "программная смена ориентации
в OnCreate при обнаружении устройства какого-то размера".
    


Ответы

Ответ 1



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

Ответ 2



В onCreate вашей Activity: @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); if (isLargeDevice(getBaseContext())) { // land или портретная this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); // если надо только land this.setRequestedOrientation(SCREEN_ORIENTATION_SENSOR_LANDSCAPE); } else { this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } } Ну и метод проверки: private boolean isLargeDevice(Context context) { int screenLayout = context.getResources().getConfiguration().screenLayout; screenLayout &= Configuration.SCREENLAYOUT_SIZE_MASK; switch (screenLayout) { case Configuration.SCREENLAYOUT_SIZE_SMALL: case Configuration.SCREENLAYOUT_SIZE_NORMAL: return false; case Configuration.SCREENLAYOUT_SIZE_LARGE: case Configuration.SCREENLAYOUT_SIZE_XLARGE: return true; default: return false; } }

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

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