Как остановить ротацию активности только для определенного фрагмента в TabLayout? - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть активность, в которую я добавил TabLayout.Каждая вкладка содержит фрагмент.Я хочу заблокировать вращение только в одном фрагменте, а не во всем.Это код, который я использую в одном фрагменте:

@Override
public void onResume() {
    super.onResume();
    if (activity != null) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

@Override
public void onPause() {
    super.onPause();
    if (activity != null) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

Но он останавливает вращение в каждом фрагменте.Как это решить?Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Вы можете попытаться переопределить setUserVisibleHint(boolean isVisibleToUser) во Фрагменте, чтобы узнать, когда фрагмент действительно отображается, например.:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
 super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser && null != activity) { 
 activity.setRequestedOrientation(
  ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else if(!isVisibleToUser && null != activity) {
 activity.setRequestedOrientation(
  ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
  }
 }

https://developer.android.com/reference/android/app/Fragment.html#setUserVisibleHint

Или поместите его в другое место, чем onResume()/onPause() и где активность не будет нулевой, например.onAttach()

1 голос
/ 02 апреля 2019

Измените свой метод onPause, чтобы разрешить каждую ориентацию в вашей деятельности, используя SCREEN_ORIENTATION_UNSPECIFIED :

@Override
public void onPause() {
    super.onPause();
    if (activity != null) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
}

надеюсь, что это поможет!


Чуть глубже:

Вам не нужно ничего указывать в своей деятельности, а просто работать с фрагментом.

В своем фрагменте используйте методы onResume и onPause, как показано ниже:

@Override
public void onResume() {
    super.onResume();
    if (activity != null) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

@Override
public void onPause() {
    super.onPause();
    if (activity != null) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
}

и оно должно работать

...