【问题标题】:Allow rotation/landscape in one fragment允许在一个片段中旋转/横向
【发布时间】:2012-11-06 13:19:53
【问题描述】:

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

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

有没有办法做到这一点?

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

【问题讨论】:

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


    【解决方案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);
        }
    }
    

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

    【讨论】:

    • 我不会覆盖setMenuVisibility 覆盖setUserVisible 它们是同时设置的,所以两者的行为应该相同,只是使用UserVisible 阅读效果更好
    【解决方案2】:

    对我有用的一件事就是把

    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
    

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

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

    【讨论】:

      【解决方案3】:

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

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

      同样设置“未指定”也不会变成横向,它会保持在原来的位置。

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

      这将重新膨胀活动布局,这意味着您将需要跟踪您所在的最后一个 ViewPager 页面,以确保在重新创建布局后显示为默认回到该片段之前它们是显示给用户并调用片段onResume()

      这会很麻烦,但是有可能。

      【讨论】:

      • 感谢您纠正我误用 configChanges 和 SCREEN_ORIENTATION_UNSPECIFIED 的问题
      【解决方案4】:

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

      android:configChanges="orientation|screenSize".
      

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

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

      对于风景:

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

      【讨论】:

      • 在更改方向片段后,如果我回到活动的基本片段,它仍然是横向如何设置它
      【解决方案5】:

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

      getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
      

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

      getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          在纵向/横向片段中:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-08
            • 2013-07-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-24
            • 1970-01-01
            相关资源
            最近更新 更多