4

そこで、Androidプログラミングのさまざまな要素を試すための基本的なチェスアプリを作成しており、これまで多くのことを学んでいますが、今回は迷子になっています。

エミュレータの向きが変わると、アクティビティがリセットされます。私の調査によると、アプリケーションが一時停止/中断されたときはいつでも同じことが起こります。キーボードの交換、電話、ホームキーの押下など。

明らかに、チェスゲームを絶えずリセットすることは実行可能ではないので、もう一度、この問題を修正する方法を学ぶ必要があることに気付きます。

私の調査では、アクティビティのonPausedメソッドのオーバーライド、オリエンテーションのリッスン、マニフェストのキーボード変更(android:configChanges経由)、Parcelablesの使用、またはシリアル化など、いくつかの主要なことが明らかになりました。

Pacelablesを使用して多くのサンプルコードを調べましたが、正直言って混乱しすぎています。明日、新鮮な目で戻ってくることは有益かもしれませんが、今のところ、Parcelablesを見れば見るほど意味がなくなります。

私のアプリケーションは、64個のセルオブジェクト(8x8 2D配列)を持つBoardオブジェクトを利用し、各セルには、実際のピースまたはスペースが空の場合はnullのピースオブジェクトがあります。パーセル可能またはシリアル化のいずれかを使用すると仮定すると、各クラス、ボード、セル、およびピースをパーセル化またはシリアル化する必要があると想定しています。

何よりもまず、ParcelableまたはSerializationは、この問題を検討するのに適切なものでさえありますか?もしそうなら、これにはParcelableまたはSerializableのどちらが好ましいですか?そして、3つのオブジェクトのそれぞれをパーセル化/シリアル化する必要があると仮定して正しいですか?最後に、Parcelableチュートリアルを理解するのが簡単なリンクはありますか?私が理解するのに役立つものは何でもあり、私のアプリケーションがさらに拡張されたときに、今後のさらなる頭痛の種を止めることができます。

どんな助けでもいただければ幸いです。

4

5 に答える 5

8

<Activity> タグのマニフェストで、android:configChanges="orientation|keyboardHidden" を追加できます。これにより、方向が変更されたとき、またはキーボードが非表示になったときに、アクティビティのリロードが停止し、代わりに 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のデフォルトの方法は、アクティビティを再作成することです。基本的に、1つのプロセスを正しく処理し、すべてが機能します。これらを手動で処理することを心配する必要はありません。

Application Fundamentalsには、アクティビティのライフサイクルの完全な概要がありますが、要するに、onSaveInstanceState()メソッドでアクティビティの状態を保存し、onCreate(Bundle savedInstanceState)で取得したバンドルを使用してアプリケーションの状態を復元する必要があります。

クラスをバンドルに保存する場合、最善の策はParcelableインターフェースを実装することです。次に、状態を保存するには、次のようにします。

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

onCreateメソッドでは、次のようにします。

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

もちろん、オブジェクトをバンドルにすでに含めることができる通常の配列表現に変換し、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 に答える