活动开始期间优雅处理屏幕导向变化
-
19-09-2019 - |
题
我正在尝试找到一种方法来正确处理设置活动,以从启动其意图的数据中确定其方向。这是用于用户可以选择级别的游戏,其中一些是int肖像方向,有些是景观方向。我面临的问题是 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
直到活动满载后才生效。这对我来说是一个问题,因为我在启动过程中进行了一些负载和图像处理,我只想做一次。
目前,如果用户选择景观水平:
- 活动开始ongreate(),默认为肖像
- 从分析其发射意图中发现它应该处于景观方向
- 继续不管一直延伸到onResume(),加载信息并执行其他设置任务
- 在这一点
- 然后,它再次从ongreate()开始,然后运行到onresume()重复以前的设置
有没有办法避免这种情况并没有执行两次加载?例如,理想情况下,该活动即使在发作之前也将在造成景观或肖像之前就知道,具体取决于发射意图的某些属性,但是除非我错过了不可能的东西。我已经设法将一种方法侵犯了一种方法,以避免通过检查 boolean
在耗时的加载步骤之前,但这似乎不是正确的方法。我想我可以覆盖 onSaveInstanceState
, ,但这需要大量其他编码。有什么简单的方法吗?
谢谢!
解决方案:
根据Daniel的回答,这实际上很容易解决。我只需要做一些小改动即可。在我的“菜单”活动中,玩家会选择要玩的级别,我只需要添加一个if/else检查才能选择我的意图启动哪个类。这是通过代表肖像或景观的简单int完成的,确定玩家何时选择了A级别。然后,我创建了一个扩展“ GameLogic”类的第二类;这是包含游戏本身的大部分代码的类,而不是菜单,说明等。
public class GameLandscape extends GameLogic{
}
从字面上看,简单而完全空。这样,它从我以前的活动中继承了所有代码,在该活动中我已经对其进行了编码以根据方向进行不同的处理方式。最后,我只需要在清单上添加一条线,说Gamelandscape总是在景观中运行,而GameLogic总是会在肖像中运行。
确实是一个简单的问题。
解决方案
您可以进行两项活动 - 一项用于肖像级别,另一个用于景观水平 - 然后使用AndroidManifest.xml设置活动的方向 android:screenOrientation
属性。如果您使用继承,甚至不必重复代码;将您当前的活动用作基本活动,只需创建景观/肖像活动作为该活动的子类别即可。
我认为更好的解决方案是要打开这两者的正确活动,尽管如果您必须通过意图额外的分析将所有内容进行路由,那么您可以将所有级别转发到第三个活动,而不仅仅是分析意图,并且然后将其转发到适当的活动。
其他提示
你也可以覆盖 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;
}
}