繁体   English   中英

在活动开始期间优雅地处理屏幕方向变化

[英]Gracefully handling screen orientation change during activity start

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

目前,如果用户选择了景观级别:

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

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

谢谢!


解:

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

public class GameLandscape extends GameLogic{
}

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

确实是一个简单的问题。

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

我认为一个更好的解决方案是Intent打开这两个的正确Activity,但是如果你必须通过Intent额外的分析来传递所有内容,你可以将所有级别转发到第三个Activity,它只做分析Intent和然后将其转发到正确的活动。

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

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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM