Я знаю, что это старо, но я добавлю свои два цента, если это кому-то поможет, так как это все еще актуальная проблема.
Примечание. Этот ответ был отредактирован днем позже, когда я опубликовал его, так как обнаружил проблему с API ниже 26. После тщательного тестирования мой окончательный ответ приведен ниже. Это решение работает (проверено) в API 21 и выше.
Мой случай может не совпадать с размещенным вопросом, поэтому я уточню, что у меня есть, и как я это решил.
- Одно действие с несколькими фрагментами.
- Только один фрагмент должен быть в книжной и альбомной ориентации, так как он имеет соответствующие разные версии макета. Остальные должны оставаться в портретной ориентации, а также экран не должен вращаться, пока приложение находится на переднем плане.
- Я использовал Котлин. Для Java должно быть почти то же самое.
В каждом фрагменте, который у вас есть, вам нужно переопределить onResume()
. В нем вы указываете, какую ориентацию вы хотите принудительно установить.
В моем случае я хотел, чтобы отображался только один фрагмент в книжной и альбомной ориентации, поэтому я установил requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
(это значение по умолчанию, если оно не установлено), но поскольку мы изменим requestedOrientation
в остальных фрагментах мы тоже должны установить здесь:
override fun onResume() {
super.onResume()
activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
//The rest of your code (if you have something else here).
}
В остальных фрагментах я хотел принудительно установить книжную ориентацию, поэтому использовал следующее:
override fun onResume() {
super.onResume()
activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
//The rest of your code (if you have something else here).
}
Это все, что вам нужно, чтобы заставить его работать! Следующее является необязательным, но может быть полезным, как это было для меня.
Необязательно 1:
Если у вас много фрагментов и вы не хотите изменять/добавлять onResume()
в каждый из них, вы можете создать подкласс (например, PortraitFragment) Fragment()
, где вы просто переопределяете onResume()
. Затем вы можете получить от него все фрагменты, в которых вы хотите иметь эту функциональность.
open class PortraitFragment : Fragment() {
override fun onResume() {
super.onResume()
activity?.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
}
Вариант 2:
В зависимости от вашего макета вы также можете добавить это.
Я использую его, так как мои макеты не подготовлены для многооконного режима.
В манифесте добавить android:resizeableActivity="false"
:
<activity android:name=".MainActivity"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden|adjustPan"
android:resizeableActivity="false">
person
MatJB
schedule
17.03.2021