it-swarm.com.ru

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

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

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

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

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

24
Garcon

Переопределите 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);
    }
}

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

33
Garcon

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

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

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

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

10
George Baker

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

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

Кроме того, настройка «НЕУТОЧНО» не изменится на альбомную, а останется на прежнем месте.

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

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

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

3
Chris.Jenkins

Напишите некоторый код в AndroidManifest.xml для конкретного тега активности.

Android:configChanges="orientation|screenSize".

И написать код во фрагменте по методу onCreateView,
для Портрета:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
setRetainInstance(true);

для ландшафта:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRetainInstance(true);
0
Virendra Kachhi

в фрагменте, который вы хотите установить, просто добавьте к своему onCreate/onCreateView

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

в других фрагментах вы хотите разрешить мульти ориентацию добавить

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
0
ravid rinek