4

アクティビティを起動したインテントのデータから方向が決定されるアクティビティの設定を適切に処理する方法を見つけようとしています。これは、ユーザーがレベルを選択できるゲーム用です。その中には縦向きのものと横向きのものがあります。私が直面している問題は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 は常に縦向きで実行されることを示す行をマニフェストに追加する必要がありました。

本当に簡単な問題です。

4

2 に答える 2

6

縦向きレベル用と横向きレベル用の 2 つのアクティビティを作成し、android:screenOrientation属性を使用して AndroidManifest.xml でアクティビティの向きを設定できます。継承を使用すれば、コードを複製する必要さえありません。現在のアクティビティを基本アクティビティとして使用し、横向き/縦向きのアクティビティをそのアクティビティのサブクラスとして作成するだけです。

より良い解決策は、意図がこれら 2 つの正しいアクティビティを開くことだと思います。次に、適切なアクティビティに転送します。

于 2010-03-12T17:15:38.400 に答える
2

オーバーライドすることもできますonRetainNonConfigurationInstance()。これにより、 を呼び出して取得できる 1 つのアイテムを一時的に保存できますgetLastNonConfigurationInstance()。そうすれば、必要なものをすべてロードでき、onRetainNonConfigurationInstance()メソッドですべてをデータ構造に保存して返すことができます。をonCreate()呼び出すことができgetLastNonConfigurationInstance()、それが null ロードを返す場合はすべてのものをロードし、何かを返す場合はすべてロードします。簡単な例を次に示します。

public class MyActivity extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        DataStructure myData = (DataStructure)getLastNonConfigurationInstance();
        if(myData == null)
        {
            // Load everything in
        }
        else
        {
            // Unpack myData
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance()
    {
        DataStructure myData = new DataStructure();
        // Put everything in to myData
        return myData;
    }
}
于 2010-03-12T17:44:12.810 に答える