2010-05-05 38 views
4

因此,我正在制作一个基本的国际象棋应用程序,以玩一些android编程的各种元素,到目前为止我学到了很多,但这一次我迷了路。Android应用重新定位方向变化,处理的最佳方式是什么?

当模拟器的方向改变时,活动被重置。根据我的研究,任何时候应用程序暂停/中断都会发生同样的事情,即。键盘改变,打电话,打回家钥匙等。

显然,国际象棋游戏不断重置是不可行的,所以我再次发现自己需要学习如何解决这个问题。

我的研究调出了一些主要的东西,覆盖了我的Activity中的onPaused方法,使用Parcelables或序列化来侦听方向,我的清单中的键盘更改(通过android:configChanges)。

我已经看过了使用Pacelables大量的示例代码,但说实话这是太混乱了。也许明天用新鲜的眼睛回来会是有益的,但是现在我越看越可接受的东西,它的意义就越小。

我的应用程序利用一个板对象,它具有64个细胞对象(在一个8×8的二维数组),并且每个单元具有一块对象,无论是实际的片或零如果空间是空的。假设我使用Parcelable或Serialization,我假设我必须Parcelize或Serialize每个类,Board,Cell和Piece。

首先,是Parcelable或序列号,甚至正确的事情在看这个问题?如果是这样的话,首选Parcelable或Serializable?我是否正确地假设三个对象中的每一个都必须是Parceled/Serialized?最后,有没有人有一个简单易懂的Parcelable教程的链接?任何事情都能帮助我理解,并在应用程序进一步扩展时停止进一步的头痛。

任何帮助,将不胜感激。

回答

3

Androids处理事件的默认方式是重新创建活动。基本上,你正确地处理一个进程,一切正常,不需要担心手动处理这些事情。

Application Fundamentals具有活动生命周期的完整概述,但总而言之,您希望将活动状态保存在onSaveInstanceState()方法中,并使用您在onCreate(Bundle savedInstanceState)中获得的Bundle来恢复您的应用程序状态。

如果你想你的类存放在包你最好的选择是实现Parcelable接口。然后保存你的状态,你做的事:

protected void onSaveInstanceState(Bundle outState) 
{ 
    super.onSaveInstanceState(outState); 
    outState.putParcelable("yourObject", mYourObject); 
} 

,并在onCreate方法你只需要做:

if (savedInstanceState != null) 
    mYourObject = savedInstanceState.getParcelable("yourObject"); 

当然,你可以只转换你的对象为普通阵列表示,该套件已经可以遏制和只是跳过实现Parcelable接口。基本上添加一个方法toArray()到你的对象和静态方法fromArray()。那么,游玩一下,看看哪个更适合你。

1

覆盖onRetainNonConfigurationInstance在你的Activity类。

在这种方法中,你必须返回一个对象,只是捆绑了你的游戏的状态在一个状态对象,在这种方法中返回。确保这只是一个状态对象,我的意思是它不应该包含在其中的活动,视图等的句柄,否则你会得到内存泄漏。

在你onCreate方法调用getLastNonConfigurationInstance获取对象回来。

您不必担心android的实现细节(序列化)。

如果您还没有确保你已经设置你的启动模式在清单要么singleTask或singleInstance这取决于适合您的需要更好。默认情况下,如果有人点击回家,然后回到应用程序,它会启动一个新的活动副本,如果没有处理或配置为单一实例,您将获得运行游戏活动的多个副本。

3

或者将这一行粘贴在OnCreate中,以便它不会滚动。问题解决了。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
+2

为什么这是upvoted?这个人想通过保持他的申请状态改变方向来解决问题。不要将他的应用限制为肖像。这是忽略了一个问题,而不是解决问题! – 2014-04-08 10:05:28

8
在<活动>标记您的清单

,你可以添加机器人:configChanges =“方向| keyboardHidden”,这将重装停止活动,并呼吁onConfigurationChanged(),而当方向改变或键盘被隐藏。

如果您需要进行调整时,这些事件的发生,你可以在你的活动覆盖onConfigurationChanged(),如果不是所有你需要做的就是将属性添加到清单。

喜欢的东西:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setContentView(R.layout.myLayout); 
} 

工作得很好。

1

当保存板状态下,使一个int[64]和在每个位置存储相应片。所以0 =空,1 =白色棋子,2 =白色骑士等...

当加载板状态下,通过在阵列迭代,并创建适当的片在适当的位置的物体。

您可以将INT [64]转换为字符串在SharedPreferences存储,或用Parcelable或任何使用它。只存储您需要的最小数据。

相关问题