如何仅针对 TabLayout 中的特定片段停止 activity 的旋转?

How to stop the rotation of an activity only for a specific fragment in TabLayout?

我有一个 activity,我在其中添加了一个 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);
    }
}

但是它停止了每个片段的旋转。如何解决这个问题?谢谢!

更改您的 onPause 方法以允许您使用 SCREEN_ORIENTATION_UNSPECIFIED:

进行活动中的每个方向
@Override
public void onPause() {
    super.onPause();
    if (activity != null) {
        activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
    }
}

希望对您有所帮助!


更深入一点:

您不必在 activity 中指定任何内容,只需使用片段即可。

在您的片段中使用如下的 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);
    }
}

它应该可以工作

您可以尝试覆盖片段中的 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() 以外的其他地方并且 activity 不会为空,例如。 onAttach()