代码之家  ›  专栏  ›  技术社区  ›  Miguel Botón

以暂停时的相同方向继续活动?

  •  2
  • Miguel Botón  · 技术社区  · 11 年前

    我想问以下行为是否可行,如果可行,我如何实现。我需要这种行为有一个非常具体的原因。

    我有两个活动,我将它们称为活动A和活动B。现在让我们看一下这个示例:

    从活动A开始,在纵向方向上,我启动活动B(具有固定的横向方向)。当活动B以横向显示时,用户显然会旋转设备。活动B结束,活动A恢复。用户将设备保持在横向方向,因此活动A的方向将在刚刚恢复之后立即改变。

    我想要的是避免用户返回活动A时活动A的方向发生变化。我希望在活动A的最后一个方向上恢复活动A,然后只允许方向变化。

    锁定方向不是一个选项,因为我希望允许用户随时更改方向。

    android:configChanges=“orientation|screenSize”解决方案既不是选项,因为我希望在方向更改后重新创建活动。

    我可以选择实现我想要的吗?

    谢谢

    编辑: 我忘了说,在活动A被破坏之前保存当前方向,并在再次创建时恢复它,这也不是一个选项。活动B完成后,不应重新创建活动A。

    编辑2: 我现在在思考,我意识到我可以从另一个角度改写这个问题。

    我希望避免在活动B完成后恢复活动A时重新创建活动A。

    之后,当设备方向发生变化时,会向ActivityThread发送一条消息(值为RELAUCH_ACTIVITY)。这将导致使用新的屏幕方向重新创建活动A。

    我想避免活动A重新启动,因为这将解决我的问题,并将保持上次的定向。

    2 回复  |  直到 11 年前
        1
  •  2
  •   David Wasser    11 年前

    我认为不可能像你所描述的那样做。当用户从横向活动返回到之前的活动时,您需要将方向锁定为纵向(以便忽略手机当前的横向方向)。现在,如果用户旋转手机,您将看不到旋转,也无法更改方向。由于你无法真正判断用户是否只是旋转了手机,或者旋转是由于从仅限风景的活动中返回,因此你无法区分这两种情况。

    但是,假设您可以以某种方式区分这两种情况,请尝试以下操作:

    如果你不希望Android在方向改变时重新创建你的活动(即使只有在某些情况下),那么你需要告诉Android你想通过设置

    android:configChanges="orientation|screenSize"
    

    在清单中。

    现在您需要实施 onConfigurationChanged() 得到你想要的行为。如果您的活动已启动另一个具有固定方向的活动,则您需要在启动该活动之前保存当前屏幕方向。当用户返回您的活动时,Android不会销毁它并创建一个新实例,它只会调用 on配置已更改() 。当你得到 on配置已更改() 呼叫时,您需要检查用户是否只是旋转了设备,或者这是从定向锁定活动返回的结果。如果这是启动另一个活动后的返回,则可以通过调用 setRequestedOrientation() 。在用户刚旋转手机的情况下,您可以:

    • 通过调用 Activity.recreate() 注意:仅当您在API级别11或更高级别上运行时,这才有效
    • 通过调用自己的方法来重新创建活动,该方法基本上完成了重新创建视图所需的所有工作(调用 setContentView() )并重置成员变量,就像重新创建活动一样
    • 通过再次启动活动重新创建活动: startActivity(new Intent(this, this.class) 然后打电话 finish() 以摆脱当前实例。
        2
  •  0
  •   Alexander    11 年前

    您可能可以将活动的当前方向存储在onStop()中的共享首选项中,并在onResume()中恢复