允许一个片段进行旋转/横屏显示

33

我的应用程序有一个单一的活动,其中包含使用ViewPagerIndicator库的FragmentPagerAdapter和四个片段。其中一个片段具有独立的纵向和横向布局设计,而其他三个则不需要,并且需要固定为纵向方向。

我考虑在清单中设置android:configChanges="orientation",并在所有片段的onResume()中调用getActivity().setRequestedScreenOrientation(),在其中三个锁定到SCREEN_ORIENTATION_PORTRAIT,但在需要允许旋转的片段中设置为SCREEN_ORIENTATION_UNSPECIFIED,但这并没有起作用。 应用程序仍然处于纵向模式。

是否有办法实现这一点?

如果有任何方法允许片段改变方向而不必旋转其活动,则实际上并不需要活动旋转,但我没有找到任何提到这种可能性的内容。 如果活动旋转也可以,因为在横向方向时选项卡栏将被隐藏,所以同样可以接受。

7个回答

37

在每个片段中重写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);
    }
}

这将允许整个活动在一个片段内旋转,但在其他片段中固定为竖屏。


2
我不会覆盖setMenuVisibility,而是覆盖setUserVisible。它们都同时设置,因此两者应该具有相同的作用,只是使用UserVisible更易读。 - Chris.Jenkins

9
有一件对我有效的事情是只需放置


getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

在每个片段的OnCreateView()方法的顶部,您需要使用适当的SCREEN_ORIENTATION常量替换ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR。一旦这样做,在ICS上它就能完美工作了。您甚至不需要为特定活动调整清单。

这将为整个活动设置,而不仅仅是单个片段。 - mathematics-and-caffeine

4
问题在于如果您启用了configChanges,则需要在您的活动/片段中处理onConfigurationChanged()方法。 这意味着,如果您确实触发了getActivity().setRequestedScreenOrientation(),那么您必须手动调用setContentView()来重新填充横向布局。
另外,设置“UNSPECIFIED”不会变为横向,它只会保持原位。
我建议对于纵向片段使用getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)。而对于横向片段,则使用getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE)
这将重新填充活动布局,这意味着您需要跟踪上次停留在哪个ViewPager页面,以确保在重新创建布局后,在向用户显示之前默认返回该片段并调用片段的onResume()
这可能有些棘手,但是可以实现。

感谢您纠正我对configChanges和SCREEN_ORIENTATION_UNSPECIFIED的误用。 - Garcon

1
在特定的activity标签中,在AndroidManifest.xml中编写一些代码。
android:configChanges="orientation|screenSize".

请在onCreateView方法中编写Fragment相关代码,
针对纵向布局:

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

适用于横向排列:

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

更改方向片段后,如果我回到活动的基本片段,它仍然是横向的,如何设置它? - Adnan haider

0

在你想要设置的片段中,只需在你的onCreate/onCreateView中添加即可。

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

在其他片段中,如果您想允许多方向,请添加

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

0
在肖像/橫向片段中:
@Override
    public void onResume() {
        super.onResume();
        requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
    }

您可以将其更改为“ActivityInfo.SCREEN_ORIENTATION_PORTRAIT”或“ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE”


0
如果您想为特定的片段更改为横向方向,请考虑以下内容。请记得在片段的生命周期停止时将其改回stopsActivityInfo.SCREEN_ORIENTATION_PORTRAIT。
@Nullable
@Override
public View onCreateView(@NotNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    return inflater.inflate(R.layout.YOUR_LAYOUT, container, false);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接