允许一个片段中的旋转/横向

时间:2012-11-06 13:19:54

标签: android android-layout android-fragments android-viewpager android-orientation

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

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

有没有办法实现这个目标?

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

7 个答案:

答案 0 :(得分:34)

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

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

答案 1 :(得分:10)

对我有用的一件事就是放

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

在每个片段的OnCreateView()方法的顶部。 您可能希望将ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR替换为相应的SCREEN_ORIENTATION常量。

一旦我这样做,它在ICS上完美运作。您没有必须调整特定活动的清单。

答案 2 :(得分:3)

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

这意味着如果您点击getActivity().setRequestedScreenOrientation(),则必须再次手动调用setContentView()以重新填充横向布局。

同样设置`UNSPECIFIED'将不会改变为横向,它将保持原样。

我会使用getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_PORTRAIT)作为肖像片段。 并且getActivity().setRequestedScreenOrientation(SCREEN_ORIENTATION_LANDSCAPE)用于景观片段。

这将重新定义活动布局,这意味着您需要跟踪最后一个ViewPager页面,以确保在重新布局布局之后显示默认返回到该片段之前显示给用户并调用片段onResume()

它会变得很繁琐,但有可能。

答案 3 :(得分:0)

您要设置的片段中的

只需添加到onCreate / onCreateView

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

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

getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);

答案 4 :(得分:0)

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

android:configChanges="orientation|screenSize".

并在onCreateView方法的片段中编写代码,
肖像:

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

for Landscape:

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

答案 5 :(得分:0)

如果要针对特定​​片段将其更改为横向,请考虑这一点。记住在片段的生命周期停止时将其更改回stopActivityInfo.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);
}

答案 6 :(得分:0)

在肖像/风景片段中:

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

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