如何在不锁定活动方向的情况下锁定片段方向?

Posted

技术标签:

【中文标题】如何在不锁定活动方向的情况下锁定片段方向?【英文标题】:How to lock fragment orientation without locking activity orientation? 【发布时间】:2013-12-20 15:50:51 【问题描述】:

我有一个特定的用例,我希望将片段锁定为纵向模式,但仍旋转活动(和/或同一活动中可见的其他片段)。有可能吗?

所有锁定片段方向的解决方案都建议使用 setRequestedOrientation 并锁定活动方向,但我需要其他可见片段来旋转。

我的应用支持 API 10+(如果有使用 API 11+ 的好解决方案,我可能会考虑在 API

提前致谢。

【问题讨论】:

【参考方案1】:

看看这个答案:

在每个片段中覆盖 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);
    

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

回答者: https://***.com/a/13252788/2767703

【讨论】:

不,这不起作用。我希望活动旋转,而不是片段。 setRequestOrientation 锁定活动方向,我在问题中已经说过这不是我想要的。 那是不可能的,你不能只旋转没有片段的活动。您可以只锁定某些片段的方向。 portrait only fragments snipet 在应用以横向模式启动时两次调用 onResume()。在 HTC One 上测试 请注意,SCREEN_ORIENTATION_FULL_SENSOR 将忽略用户设置并始终根据传感器位置旋转屏幕。如果您希望应用用户轮换设置,请改用 SCREEN_ORIENTATION_UNSPECIFIED【参考方案2】:

回复可能有点晚了,但我可以看到您还没有找到解决方案,您可以尝试这样做,每当您从活动中调用片段时,请在其前面添加以下代码

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

对于所有其他/默认片段

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);

希望对我有所帮助

【讨论】:

这工作正常。但是当按下后退按钮时,前面的片段也改变了方向。那么我们如何才能阻止以前的片段改变它们的方向呢? 编写一个基本片段并应用@bikash 在其中写的内容。然后让你的所有其他片段继承自这个片段,以传播行为。

以上是关于如何在不锁定活动方向的情况下锁定片段方向?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-c:如何在启用纵向锁定的情况下在捕获后修复图像方向

锁定活动方向时检测设备方向

当活动方向被锁定时检测设备方向

即使设备已锁定方向,如何进行方向检测

iOS 应用程序方向旋转锁定/解锁由应用程序的配置

如何在没有活动旋转的情况下旋转活动内的片段?