0

我正在尝试编写一个应用程序,我希望将手机锁定为纵向,但允许平板电脑版本同时具有横向和纵向。

我根据以下所有问题创建了一些几乎可以工作的东西......

如何锁定手机的屏幕方向,而不是平板电脑?(Android) 如何只允许平板电脑的横向/纵向 手机纵向,平板电脑横向(Android-Layout) 横向模式仅在平板电脑 中锁定手机在纵向模式

到目前为止,我所做的是将 Activity 扩展到我自己的基本 Activity 并在 onCreate 和覆盖的 onConfigurationChanged 中包含方向更改代码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if(!(new DeviceHelper().isTablet(this)))
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        super.onCreate(savedInstanceState);
        setupActionBar(getActivity());


    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        //don't reload the current page when the orientation is changed
        if(!(new DeviceHelper().isTablet(this)))
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        super.onConfigurationChanged(newConfig);

    }

一切正常(我覆盖了 onConfigurationChanged 以避免活动被破坏和重新创建,这会导致黑屏一秒钟)。

我的主要问题是,如果您以横向方式握住手机,那么活动仍然是纵向的……完美!但是,因为手机是实际的横向布局,所以使用横向布局,这是来自平板电脑的布局。

我的理解是,当调用setRequestedOrientation时,它应该立即触发onConfigurationChanged,但是,首先调用片段,然后布局错误膨胀,然后再调用onConfigurationChanged,这意味着已经设置了横向布局。

我知道我可以根据配置在每个活动中设置布局,但我真的不想这样做。

那么如何让应用程序根据 setRequestedOrientation 使用适当 res 文件夹中的适当布局文件。

谢谢

4

2 回答 2

2

如果您的横向布局仅适用于平板电脑,我建议您将其放在平板电脑布局文件夹中,即:layout-sw600dp-land(用于 7in 平板电脑横向)和 layout-sw720dp-land(用于 10in 平板电脑横向)。这样,平板电脑布局将仅用于平板电脑。如果您没有为手机声明横向布局,它将使用常规纵向布局。为平板电脑和手机布局分离布局文件夹有助于组织。

于 2014-05-13T16:24:41.917 回答
2

一切正常(我覆盖了 onConfigurationChanged 以避免活动被破坏和重新创建,这会导致黑屏一秒钟)。

我很确定这是您问题的根源。您应该能够在不覆盖onConfigurationChanged. 让操作系统处理配置更改并提供正确的布局文件。

如果你这样做,你应该擅长平板电脑。他们不应该设置特定的方向,并且应该为每个活动打开正确的方向。电话设备将出现您所说的快速黑屏问题。正在发生的事情是,活动将首先在手机所在的方向打开,比如横向。然后它将在代码中将其方向设置为 Portrait 并进行配置更改,重新创建 Activity 并导致您看到的瞬间闪烁。

有一些方法可以缓解这种情况。

  • android:screenOrientation="behind"AndroidManifest.xml每个活动中使用。这将以上一个 Activity 所在的方向启动 Activity(手机的纵向,平板电脑的任何内容)。然后,您不必担心 Activity 会被创建两次,因为它始终会以正确的方向自行启动。

  • 但是,这并不能解决您的第一个活动。您可以处理启动器 Activity 在应用程序启动时只闪烁一次,或者您可以android:screenOrientation="portrait"在清单中将启动器 Activity 设置为并确保setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);在代码中将平板电脑设置为。这可能会导致平板电脑在启动时出现闪存。

仅使用第一个要点就足够了,但您应该根据应用程序的用户体验要求定制您的实现。

于 2014-05-13T12:09:52.003 回答