如何仅针对 TabLayout 中的特定片段停止活动轮换



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

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

您可以尝试覆盖片段中的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()

使用SCREEN_ORIENTATION_UNSPECIFIED更改onPause方法以允许活动中的每个方向:

@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);
    }
}

它应该工作

最新更新