4

我正在尝试找到一种方法来正确处理设置活动,该活动的方向由启动它的意图中的数据确定。这是一款用户可以选择关卡的游戏,其中一些是纵向的,有些是横向的。我面临的问题是setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)在活动完全加载之前不会生效。这对我来说是个问题,因为我在启动过程中做了一些加载和图像处理,我只想做一次。

目前,如果用户选择横向级别:

  • 活动开始 onCreate(),默认为纵向
  • 分析它的启动意图发现它应该是横向的
  • 继续进行到 onResume()、加载信息和执行其他设置任务
  • 此时 setRequestedOrientation 启动,因此应用程序通过 onPause() 运行到 onDestroy()
  • 然后它再次从 onCreate() 启动并运行到 onResume() 重复之前的设置

有没有办法避免这种情况并且让它不执行两次加载?例如,理想情况下,活动会在调用 onCreate 之前就知道它应该是横向还是纵向,具体取决于启动意图的某些属性,但除非我错过了一些不可能的事情。我已经设法通过在耗时的加载步骤之前检查 a 来避免重复加载boolean,但这似乎不是正确的方法。我想我可以覆盖onSaveInstanceState,但这需要大量额外的编码。有没有一种简单的方法可以做到这一点?

谢谢!


解决方案:

根据丹尼尔的回答,这实际上很容易解决。我只需要做一些小改动。在我的“菜单”活动中,玩家可以选择玩哪个关卡,我只需要添加一个 if/else 检查来选择哪个类将由我的 Intent 启动。这是通过一个代表纵向或横向的简单 int 完成的,由玩家选择关卡时确定。然后我创建了第二个类来扩展我的“GameLogic”类;这是包含游戏本身大部分代码的类,而不是菜单、说明等。

public class GameLandscape extends GameLogic{
}

从字面上看,就是这么简单,完全是空的。这样,它继承了我之前的活动中的所有代码,我已经对其进行了编码,以根据方向以不同的方式处理事情。最后,我只需要在清单中添加一行,说明 GameLandscape 将始终以横向运行,而 GameLogic 将始终以纵向运行。

所以确实是一个简单的问题。

4

2 回答 2

6

您可以制作两个活动 - 一个用于纵向级别,另一个用于横向级别 - 然后使用该android:screenOrientation属性在 AndroidManifest.xml 中设置 Activity 的方向。如果您使用继承,您甚至不必复制代码;使用您当前的活动作为基础活动,并将景观/肖像活动创建为该活动的子类。

我认为更好的解决方案是让 Intent 打开这两个的正确 Activity,但如果您必须通过 Intent 额外分析路由所有内容,您可以将所有级别转发到第三个 Activity,它只会分析 Intent 和然后将其转发给适当的活动。

于 2010-03-12T17:15:38.400 回答
2

你也可以覆盖onRetainNonConfigurationInstance(). 这使您可以临时存储一个可以通过调用检索的项目getLastNonConfigurationInstance()。这样你就可以加载你需要的所有东西,并且在你的onRetainNonConfigurationInstance()方法中你可以将它们全部保存到一个数据结构中并返回它。在onCreate()你可以调用getLastNonConfigurationInstance(),如果返回空负载,加载你所有的东西,如果它返回一些东西,那么你已经全部加载了。这是一个简单的例子:

public class MyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        DataStructure myData = (DataStructure)getLastNonConfigurationInstance();
        if(myData == null)
        {
            // Load everything in
        }
        else
        {
            // Unpack myData
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance()
    {
        DataStructure myData = new DataStructure();
        // Put everything in to myData
        return myData;
    }
}
于 2010-03-12T17:44:12.810 回答