Android - 将手机锁定为纵向,但允许平板电脑同时为横向和纵向

时间:2014-05-12 17:36:17

标签: android android-layout onconfigurationchanged

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

我根据以下所有问题创造了几乎可以运作的东西......

How do I lock screen orientation for phone, but not for tablet? (Android) How to allow both landscape/portrait for tablets only Portrait for phone, landscape for Tablet (Android-Layout) landscape mode in tablet only Locking phone in portrait mode

我到目前为止所做的是将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文件夹中的相应布局文件。

由于

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

  

所有这一切都运行正常(我覆盖了onConfigurationChanged以避免活动被破坏并重新创建,导致黑屏在几分之一秒内)。

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

如果你这样做,你应该对平板电脑很好。他们不应该设置特定的方向,他们应该打开每个活动的正确方向。手机设备会出现您正在谈论的快速黑屏问题。发生的事情是,活动将首先打开手机的方向,比如风景。然后它将在代码中将其方向设置为纵向并进行配置更改,重新创建活动并导致您看到的瞬间闪光。

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

  • 在每个活动的android:screenOrientation="behind"中使用AndroidManifest.xml。这将以前一个活动所在的方向启动活动(手机的肖像,平板电脑的任何内容)。然后你永远不必担心Activity被创建两次,因为它总是以正确的方向开始。

  • 但这并不能解决您的第一个活动。您可以在应用启动时处理具有该闪光灯的启动器活动,或者您可以将清单中的启动器活动设置为android:screenOrientation="portrait",并确保在代码中将平板电脑设置为setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);。这可能会导致平板电脑启动时发生闪光。

仅使用第一个项目符号应该足够好,但您应该根据应用程序的用户体验要求定制实施。