我正在寻找一种正确处理设置活动的方式,其中其方向是由启动它的意图中的数据确定的。这是为了一个游戏,用户可以选择关卡,其中一些是纵向方向,一些是横向方向。我面临的问题是,
目前,如果用户选择横向关卡:
- 活动从onCreate()开始,默认为纵向 - 通过分析其启动Intent发现应处于横向方向 - 继续到onResume(),加载信息并执行其他设置任务 - 此时setRequestedOrientation生效,因此应用程序运行到onPause()到onDestroy() - 然后再次从onCreate()开始,并重复从早期进行的设置,直到onResume()
有没有办法避免这样做并使其不重复加载两次?例如,理想情况下,在调用onCreate之前,活动将知道它是否应该是纵向或横向,具体取决于启动意图的某个属性,但除非我错过了什么,否则不可能。我设法通过检查耗时加载步骤之前的布尔值来解决避免重复加载的方法,但这似乎不是正确的做法。我想我可以覆盖onSaveInstanceState,但那需要大量额外的编码。有没有简单的方法来做到这一点?
解决方法:
根据Daniel的答案,这实际上很容易解决。我只需要进行一些小的更改。在我的“菜单”活动中,玩家将选择要玩的级别,我只需要添加一个if / else检查以选择由我的Intent启动的类。这是通过一个简单的int表示纵向或横向完成的,在玩家选择级别时确定。然后,我创建了第二个类,扩展了我的“GameLogic”类;这是包含大部分游戏本身代码的类,而不是菜单、说明等。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
只有在活动完全加载后才会生效。对我来说,这是一个问题,因为我在启动期间执行一些加载和图像处理,我希望只需执行一次。目前,如果用户选择横向关卡:
- 活动从onCreate()开始,默认为纵向 - 通过分析其启动Intent发现应处于横向方向 - 继续到onResume(),加载信息并执行其他设置任务 - 此时setRequestedOrientation生效,因此应用程序运行到onPause()到onDestroy() - 然后再次从onCreate()开始,并重复从早期进行的设置,直到onResume()
有没有办法避免这样做并使其不重复加载两次?例如,理想情况下,在调用onCreate之前,活动将知道它是否应该是纵向或横向,具体取决于启动意图的某个属性,但除非我错过了什么,否则不可能。我设法通过检查耗时加载步骤之前的布尔值来解决避免重复加载的方法,但这似乎不是正确的做法。我想我可以覆盖onSaveInstanceState,但那需要大量额外的编码。有没有简单的方法来做到这一点?
解决方法:
根据Daniel的答案,这实际上很容易解决。我只需要进行一些小的更改。在我的“菜单”活动中,玩家将选择要玩的级别,我只需要添加一个if / else检查以选择由我的Intent启动的类。这是通过一个简单的int表示纵向或横向完成的,在玩家选择级别时确定。然后,我创建了第二个类,扩展了我的“GameLogic”类;这是包含大部分游戏本身代码的类,而不是菜单、说明等。
public class GameLandscape extends GameLogic{
}
这真的很简单,完全没有内容。这样它就继承了我之前活动中的所有代码,在那里我已经编写了不同方向处理事物的代码。最后,我只需要在清单中添加一行,指定GameLandscape始终在横向运行,而GameLogic始终在纵向运行。
所以这是一个非常简单的问题。