所以我正在制作一个基本的国际象棋应用来玩各种各样的android编程元素,到目前为止我学到了很多,但这次我迷路了。
当模拟器的方向改变时,活动将被重置。根据我的研究,在应用程序暂停/中断的任何时候都会发生同样的事情,即。键盘更换,电话,打回家钥匙等。
显然,让国际象棋游戏不断重置是不可行的,所以我再次发现自己需要学习如何解决这个问题。
我的研究提出了一些主要的事情,在我的Activity中覆盖onPaused方法,在我的清单中监听Orientation,键盘更改(通过android:configChanges),使用Parcelables或Serialization。
我已经使用Pacelables查找了很多示例代码,但说实话它太混乱了。也许明天以新鲜的眼睛回来将是有益的,但是现在我越是看到Parcelables它的意义就越小。
我的应用程序使用一个Board对象,它有64个Cell对象(在8x8 2D数组中),每个单元格都有一个Piece Object,如果空格是空的,则为实际的一块或null。假设我使用Parcelable或Serialization,我假设我必须对每个类,Board,Cell和Piece进行Parcelize或Serialize。
首先,Parcelable或Serialization是否正确地考虑这个问题?如果是这样,Parcelable或Serializable是首选吗?我是否正确假设三个对象中的每一个都必须是Parceled / Serialized?最后,是否有人链接到一个简单易懂的Parcelable教程?任何可以帮助我理解的东西,当我的应用程序进一步扩展时,可以阻止进一步的麻烦。
任何帮助都将不胜感激。
答案 0 :(得分:8)
在< Activity>中的清单中tag,你可以添加android:configChanges =“orientation | keyboardHidden”,这将阻止活动重新加载并调用onConfigurationChanged(),而不是改变方向或隐藏键盘。
如果您需要在发生这些事件中的任何一个时进行调整,您可以覆盖活动中的onConfigurationChanged(),如果不是您需要做的就是将属性添加到清单。
类似的东西:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setContentView(R.layout.myLayout);
}
效果很好。
答案 1 :(得分:3)
Androids处理事件的默认方式是重新创建活动。基本上你正确处理一个过程,一切正常,不用担心手动处理这些事情。
Application Fundamentals有一个完整的活动生命周期概述,但总之,你想在onSaveInstanceState()方法中保存你的活动状态,并使用你在onCreate(Bundle savedInstanceState)中获得的Bundle来恢复你的申请状态。
如果您想将课程存储在Bundle中,最好的办法是实现Parcelable界面。然后保存您的状态:
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putParcelable("yourObject", mYourObject);
}
在onCreate方法中你只需:
if (savedInstanceState != null)
mYourObject = savedInstanceState.getParcelable("yourObject");
当然,您可以将对象转换为Bundle已经包含的常规数组表示形式,然后跳过实现Parcelable接口。基本上为方法添加一个方法toArray()和一个静态方法fromArray()。好吧,到处玩,看看哪个更适合你。
答案 2 :(得分:3)
或者在OnCreate中粘贴这一行,这样它就不会发生变化。问题解决了。
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
答案 3 :(得分:1)
覆盖Activity类中的onRetainNonConfigurationInstance。
在此方法中,您必须返回一个对象,只需将游戏状态捆绑在一个状态对象中,然后以此方法返回。确保这只是一个状态对象,我的意思是它应该没有包含在其中的活动,视图等的句柄,否则你会得到内存泄漏。
在你的onCreate方法中调用getLastNonConfigurationInstance来获取对象。
你不必担心android处理的实现细节(序列化)。
如果您尚未确定已将清单中的启动模式设置为singleTask或singleInstance,具体取决于哪种更适合您的需求。默认情况下,如果有人回到家中然后回到您的应用程序,它会启动活动的新副本,如果没有处理或配置单个实例,您将获得运行的游戏活动的多个副本。
答案 4 :(得分:1)
当您保存电路板状态时,请设置int[64]
并在每个位置存储相应的部分。所以0 =空,1 =白兵,2 =白骑士等......
加载电路板状态时,遍历数组并在适当的位置创建相应的电路对象。
您可以将int [64]转换为要存储在SharedPreferences中的字符串,或者将其与Parcelable或其他任何内容一起使用。只存储您需要的最少数据。