アクティビティの開始時に画面の向きの変更を優雅に処理します
-
19-09-2019 - |
質問
私は、それを起動した意図のデータからその方向が決定されるアクティビティのセットアップを適切に処理する方法を見つけようとしています。これは、ユーザーがレベルを選択できるゲームのためです。その一部はINTポートレートオリエンテーションであり、一部は景観向きです。私が直面している問題はそれです setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
アクティビティが完全にロードされるまで有効になりません。私は起動中にいくつかの読み込みと画像処理をしているので、これは私にとって問題です。
現在、ユーザーがランドスケープレベルを選択した場合:
- アクティビティはoncreate()を開始し、デフォルトでポートレートになります
- ランドスケープオリエンテーションにあるべきであるという立ち上げ意図を分析することから発見します
- Onresume()までずっと続き、情報を読み込み、他のセットアップタスクを実行します
- この時点で、setrequestedorientationがキックインして、アプリケーションがonpause()を介してondestroy()に実行されるため
- その後、再びoncreate()から起動し、onresume()に実行されます。以前からセットアップを繰り返します
それを回避し、それが2回負荷を実行しないようにする方法はありますか?たとえば、理想的には、OnCreateでさえ、発売の意図のある財産に応じて風景かポートレートかと呼ばれる前に、アクティビティは知っているでしょうが、不可能なものを見逃していない限り。私は、荷重を繰り返してチェックすることを避ける方法を一緒にハッキングすることができました boolean
時間のかかる読み込み手順の前は、それはそれを行う正しい方法のようには見えません。オーバーライドできると思います onSaveInstanceState
, 、しかし、それには多くの追加のコーディングが必要です。これを行う簡単な方法はありますか?
ありがとう!
解決:
ダニエルの答えによると、これは実際には簡単に修正できました。いくつかの小さな変更を加える必要がありました。プレイヤーがプレイするレベルを選択する私の「メニュー」アクティビティでは、IF/他のチェックを追加して、自分の意図によってどのクラスが開始されるかを選択する必要がありました。これは、プレーヤーがレベルを選択したときに決定された、ポートレートまたはランドスケープを表す単純なINTで行われました。次に、「GameLogic」クラスを拡張する2番目のクラスを作成しました。これは、メニュー、指示などではなく、ゲーム自体のコードのほとんどを含むクラスです。
public class GameLandscape extends GameLogic{
}
文字通り、そのシンプルで完全に空です。そうすれば、オリエンテーションに応じて物事を異なる方法で処理するためにすでにコードしていた以前のアクティビティからすべてのコードを継承しました。最後に、GamelandScapeは常に風景で実行され、GameLogicが常に肖像画で実行されると述べるマニフェストにラインを追加する必要がありました。
確かに単純な問題です。
解決
2つのアクティビティを作成できます - 1つはポートレートレベル用、もう1つはランドスケープレベル用です。 android:screenOrientation
属性。継承を使用する場合、コードを複製する必要さえありません。現在のアクティビティをベースアクティビティとして使用し、そのアクティビティのサブクラスとしてランドスケープ/ポートレートアクティビティを作成するだけです。
より良い解決策は、これら2つの正しいアクティビティを開くことを目的としていると思いますが、意図的な追加分析を介してすべてをルーティングする必要がある場合は、意図を分析する以外に何もない3番目のアクティビティにすべてのレベルを転送できます。次に、適切なアクティビティに転送します。
他のヒント
オーバーライドすることもできます onRetainNonConfigurationInstance()
. 。これにより、呼び出して取得できるアイテムを一時的に保存できます 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;
}
}