【问题标题】:Android - Lock phone to portrait but allow tablet to be both landscape and portraitAndroid - 锁定电话肖像,但允许平板电脑既景观和肖像
【发布时间】:2014-06-30 04:34:16
【问题描述】:

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

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

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 文件夹中的适当布局文件。

谢谢

【问题讨论】:

  • 您将横向布局文件放在哪个文件夹中?
  • 我有两个文件,一个在普通布局中,另一个在布局域中。使用 layout-land 文件是因为手机处于横向状态,即使 Activity 被锁定为纵向。
  • 请看this回答希望这对某人有帮助

标签: android android-layout onconfigurationchanged


【解决方案1】:

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

【讨论】:

  • 谢谢,这是我在您回复前大约 3 小时才真正意识到的,所以我这样做了。它没有回答我原来的问题,你没有根据新设置的方向获取资源文件,而是手机在里面。但你的回答是我为解决我的问题所做的,所以我会给出你是滴答声
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

  • 这一切听起来都不错,但我认为它不会解决我在手机处于横向时使用横向布局文件的首要问题,即使我将方向设置为纵向与 setRequestedOrientation。我意识到,因为我只希望平板电脑中的横向将横向布局和值文件从标准横向文件夹移到 sw600dp 文件夹中,所以解决了我所有的问题。
  • @RussWheeler 如果您不手动处理配置更改,操作系统将提供正确的资源。如果您的设备方向设置为纵向,则无论您如何握住设备,您都应该获得纵向布局。这就是为什么我建议onConfigurationChange 代码是您问题的根源。
  • 好的,我试试看 tmrw
猜你喜欢
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 2018-11-08
相关资源
最近更新 更多