我正在尝试找到一种正确处理设置活动的方法,其中的方向取决于启动它的意图中的数据。这适用于用户可以选择级别的游戏,其中一些是纵向方向,一些是横向方向。我面临的问题是setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
在活动完全加载之前不会生效。这对我来说是个问题,因为我在启动期间进行了一些加载和图像处理,我只想做一次。
目前,如果用户选择了横向级别:
有没有办法避免这种情况,并且没有执行两次加载?例如,理想情况下,即使onCreate被调用,活动也会知道它是应该是横向还是纵向,这取决于启动意图的某些属性,但除非我错过了一些不可能的东西。我已经设法通过在耗时的加载步骤之前检查boolean
来避免重复加载的方法,但这似乎不是正确的方法。我想我可以覆盖onSaveInstanceState
,但这需要大量额外的编码。有一种简单的方法可以做到这一点吗?
谢谢!
解决方案:
根据丹尼尔的回答,这实际上很容易解决。我只需做一些小改动。在我的“菜单”活动中,玩家将选择要播放的等级,我只需添加一个if / else检查来选择我的Intent将启动哪个类。这是通过一个表示肖像或风景的简单int完成的,当玩家选择一个关卡时确定。然后我创建了第二个扩展我的'GameLogic'类的类;这是包含游戏本身大部分代码的类,而不是菜单,说明等。
public class GameLandscape extends GameLogic{
}
字面上那简单而完全空洞。这样,它继承了我以前的活动中的所有代码,我已经将其编码为根据方向不同地处理事物。最后,我只需在清单中添加一行,说明GameLandscape将始终以横向运行,而GameLogic将始终以纵向运行。
确实是一个简单的问题。
答案 0 :(得分:6)
您可以制作两个活动 - 一个用于纵向关卡,另一个用于横向关卡 - 然后使用android:screenOrientation
属性在AndroidManifest.xml中设置活动的方向。如果使用继承,您甚至不必重复代码;使用当前的Activity作为基本活动,只需创建横向/纵向活动作为该活动的子类。
我认为一个更好的解决方案是让Intent打开这两个的正确Activity,但是如果你必须通过Intent额外分析将所有内容都路由,你可以将所有级别转发给第三个只执行分析的Activity意图,然后将其转发到适当的活动。
答案 1 :(得分:2)
您也可以覆盖onRetainNonConfigurationInstance()
。这使您可以通过调用getLastNonConfigurationInstance()
临时存储一个可以检索的项目。这样您就可以加载所需的所有内容,并在onRetainNonConfigurationInstance()
方法中将所有内容保存到数据结构中并返回。您可以在onCreate()
中调用getLastNonConfigurationInstance()
,如果返回null加载,请加载所有内容,如果它返回了某些内容,则将其全部加载。这是一个简单的例子:
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;
}
}