アクティビティを起動したインテントのデータから方向が決定されるアクティビティの設定を適切に処理する方法を見つけようとしています。これは、ユーザーがレベルを選択できるゲーム用です。その中には縦向きのものと横向きのものがあります。私が直面している問題はsetRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
、アクティビティが完全に読み込まれるまで有効にならないことです。起動時にロードと画像処理を行うので、これは私にとって問題です。これは一度だけ行う必要があります。
現在、ユーザーが横向きレベルを選択した場合:
- アクティビティが onCreate() で開始され、デフォルトで縦向きになります
- 起動インテントを分析して、横向きにする必要があることを発見しました
- onResume() に関係なく続行し、情報をロードし、他のセットアップ タスクを実行します。
- この時点で setRequestedOrientation が開始されるため、アプリケーションは onPause() から onDestroy() まで実行されます。
- その後、再び onCreate() から起動し、 onResume() まで実行され、以前のセットアップを繰り返します
それを回避し、読み込みを 2 回実行しないようにする方法はありますか? たとえば、理想的には、onCreate が呼び出される前に、起動インテントのいくつかのプロパティに応じて横向きにするか縦向きにするかをアクティビティが認識しますが、不可能なことを見逃していない限り。時間のかかるロード手順の前にチェックすることで、ロードの繰り返しを回避する方法をハックすることができましたboolean
が、それは正しい方法ではないようです。をオーバーライドできると思いますonSaveInstanceState
が、それには多くの追加コーディングが必要になります。これを行う簡単な方法はありますか?
ありがとう!
解決:
ダニエルの答えによると、これは実際には非常に簡単に修正できました。いくつかの小さな変更を加える必要がありました。プレイヤーがプレイするレベルを選択する「メニュー」アクティビティでは、インテントによって開始されるクラスを選択するために if/else チェックを追加する必要がありました。これは、プレイヤーがレベルを選択したときに決定される、ポートレートまたはランドスケープを表す単純な int を使用して行われました。次に、「GameLogic」クラスを拡張する 2 つ目のクラスを作成しました。これは、メニューや説明などではなく、ゲーム自体のほとんどのコードを含むクラスです。
public class GameLandscape extends GameLogic{
}
文字通りシンプルで完全に空です。こうすることで、以前のアクティビティからすべてのコードを継承し、方向に応じて異なる処理を行うようにコーディングしました。最後に、GameLandscape は常に横向きで実行され、GameLogic は常に縦向きで実行されることを示す行をマニフェストに追加する必要がありました。
本当に簡単な問題です。