Разрешить поворот / пейзаж в одном фрагменте

Мое приложение имеет одно действие с FragmentPagerAdapter с четырьмя фрагментами (с использованием библиотеки ViewPagerIndicator). Один из этих фрагментов имеет дизайн как для отдельной портретной, так и для ландшафтной компоновки, а другие три не требуют и должны быть привязаны к портретной ориентации.

Моя мысль заключалась в том, чтобы установить android:configChanges="orientation" в манифесте и вызвать getActivity().setRequestedScreenOrientation() в onResume() всех фрагментов, блокировка в SCREEN_ORIENTATION_PORTRAIT в трех из них, но в SCREEN_ORIENTATION_UNSPECIFIED в том, что нужно Разрешить вращение, но это не сработает. Приложение остается в портретном режиме.

Есть ли способ достичь этого?

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

Solutions Collecting From Web of "Разрешить поворот / пейзаж в одном фрагменте"

Переопределите setUserVisibleHint() в каждом фрагменте.

На портрете только фрагменты:

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser) { Activity a = getActivity(); if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } } 

В портрете / пейзажном фрагменте:

 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(isVisibleToUser) { Activity a = getActivity(); if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); } } 

Это позволит всей деятельности вращаться в одном фрагменте, но фиксировать ее на портрет в других.

Одна вещь, которая работала для меня, заключалась в том, чтобы просто положить

 getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR); 

В верхней части методов OnCreateView() для каждого из фрагментов. Вы бы хотели заменить ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR на соответствующую константу SCREEN_ORIENTATION .

Как только я это сделал, он отлично работал на ICS. Вам не нужно настраивать манифест для конкретной деятельности.

Проблема заключается в том, что если вы активируете configChanges вам необходимо обработать onConfigurationChanged() в вашей активности / фрагментах.

Это означает, что если вы getActivity().setRequestedScreenOrientation() вам придется вручную вызвать setContentView() чтобы повторно установить ландшафтную макет.

Также установка `UNSPECIFIED 'не изменится на пейзаж, она останется там, где она есть.

Я бы использовал getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) для портретных фрагментов. И getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE) для фрагментов ландшафта.

Это заново закроет макет активности, а это значит, что вам нужно будет отслеживать последнюю страницу ViewPager, где вы находитесь, чтобы убедиться, что вы показываете, что после того, как макет был воссоздан по умолчанию для этого фрагмента, прежде чем они будут показаны на Пользователь и фрагмент onResume() .

Это будет неудобно, но это возможно.

В фрагменте, который вы хотите установить, просто добавьте в свой onCreate / onCreateView getActivity (). SetRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); В других фрагментах, которые вы хотите разрешить многопользовательской ориентации, добавьте getActivity (). SetRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);