4

所以我正在制作一个基本的国际象棋应用程序来玩转android编程的一些不同元素,到目前为止我学到了很多东西,但这次我迷路了。

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

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

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

我已经使用 Pacelables 查找了很多示例代码,但老实说它太令人困惑了。也许明天带着新的眼光回来会是有益的,但现在我看 Parcelables 的次数越多,它的意义就越小。

我的应用程序使用了一个 Board 对象,它有 64 个 Cell 对象(在一个 8x8 2D 数组中),每个单元格都有一个 Piece Object,如果空间为空,则可以是实际的一块或 null。假设我使用 Parcelable 或 Serialization,我假设我必须对每个类、Board、Cell 和 Piece 进行 Parcelize 或序列化。

首先,Parcelable 或 Serialization 是否是解决这个问题的正确方法?如果是这样,Parcelable 或 Serializable 是首选吗?我是否正确假设这三个对象中的每一个都必须被打包/序列化?最后,有人有一个简单易懂的 Parcelable 教程的链接吗?当我的应用程序进一步扩展时,任何可以帮助我理解并停止进一步头痛的事情。

任何帮助,将不胜感激。

4

5 回答 5

8

在 <Activity> 标签的清单中,您可以添加 android:configChanges="orientation|keyboardHidden",这将停止 Activity 重新加载并在更改方向或隐藏键盘时调用 onConfigurationChanged()。

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

就像是:

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

效果很好。

于 2010-05-07T19:20:50.300 回答
3

或者把这条线放在你的 OnCreate 中,这样它就不会旋转。问题解决了。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
于 2010-05-05T16:33:22.213 回答
3

Android 处理事件的默认方式是重新创建活动。基本上你正确地处理了一个过程并且一切正常,无需担心手动处理这些事情。

Application Fundamentals对Activity 生命周期有一个完整的概述,但简而言之,您希望在 onSaveInstanceState() 方法中保存您的 Activity 状态,并使用您在 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()。好吧,玩一下,看看哪个更适合你。

于 2010-05-05T15:59:29.443 回答
1

在 Activity 类中覆盖 onRetainNonConfigurationInstance。

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

在您的 onCreate 方法中调用 getLastNonConfigurationInstance 以取回对象。

您不必担心实现细节(序列化)android 会处理这些。

如果您尚未确保已将清单中的启动模式设置为 singleTask 或 singleInstance,具体取决于哪个更适合您的需求。默认情况下,如果有人回家然后回到您的应用程序,它会启动一个新的活动副本,如果没有为单个实例处理或配置,您将获得运行游戏活动的多个副本。

于 2010-05-05T16:00:08.447 回答
1

当您保存棋盘状态时,int[64]在每个位置创建一个并存储相应的棋子。所以0=空,1=白兵,2=白马,等等……

当您加载棋盘状态时,遍历数组并在适当的位置创建适当的棋子对象。

您可以将 int[64] 转换为字符串以存储在 SharedPreferences 中,或者将其与 Parcelable 或其他任何内容一起使用。只存储您需要的最少数据。

于 2010-05-07T20:00:50.510 回答