30

我的应用程序有一个带有四个片段的 FragmentPagerAdapter 的 Activity(使用 ViewPagerIndicator 库)。其中一个片段具有单独的纵向和横向布局设计,其他三个没有并且需要固定为纵向。

我的想法是设置android:configChanges="orientation"清单并调用所有片段,锁定getActivity().setRequestedScreenOrientation()其中三个,但锁定需要允许旋转的一个,但这不起作用。该应用程序仍处于纵向模式。onResume()SCREEN_ORIENTATION_PORTRAITSCREEN_ORIENTATION_UNSPECIFIED

有没有办法做到这一点?

如果无论如何允许片段在其活动不这样做的情况下改变方向,则实际活动实际上不需要旋转,但我没有发现任何提到这是可能的。如果活动旋转也同样可以,因为标签栏在横向时将被隐藏。

4

7 回答 7

36

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

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

于 2012-11-06T14:11:07.520 回答
10

对我有用的一件事就是把

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

OnCreateView()在每个片段的方法的顶部。您可能想ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR用适当的SCREEN_ORIENTATION常量替换。

一旦我这样做了,它就可以在 ICS 上完美运行。您不必为特定活动调整清单。

于 2012-12-22T03:07:34.953 回答
4

问题是,如果您启用configChanges,则需要处理onConfigurationChanged()活动/片段中的方法。

这意味着如果您确实触发了,getActivity().setRequestedScreenOrientation()您将不得不再次手动调用setContentView()以重新填充横向布局。

同样设置“未指定”不会更改为横向,它将保持在原处。

我会使用getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)肖像片段。而getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE)对于景观碎片。

这将重新膨胀活动布局,这意味着您将需要跟踪您所在的最后一个 ViewPager 页面,以确保在重新创建布局后显示为默认返回该片段,然后再显示给用户和片段onResume()被调用。

它会很繁琐,但是,这是可能的。

于 2012-11-06T13:33:57.387 回答
1

AndroidManifest.xml在特定的活动标签上写一些代码。

android:configChanges="orientation|screenSize".

onCreateView并在 Fragment on方法中编写代码,
用于 Portrait:

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

景观:

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
setRetainInstance(true);
于 2018-02-06T10:43:21.213 回答
0

在纵向/横向片段中:

@Override
    public void onResume() {
        super.onResume();
        requireActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
    }

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

于 2021-02-16T13:05:37.297 回答
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);
}
于 2020-11-16T03:42:33.793 回答
0

在您要设置的片段中,只需添加到您的onCreate/onCreateView

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

在您想要允许多方向添加的其他片段中

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
于 2017-06-03T10:50:43.530 回答