1

私の Android アプリケーションには、onConfigurationChanged() メソッドをオーバーライドするメイン アクティビティ「MyActivity」があります。そのメソッド内で、向きの変更を確認し、横向きに変更された場合は別のアクティビティを呼び出します。

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        super.onConfigurationChanged(newConfig);
        startActivity(new Intent(this, BaseFullScreenActivity.class));
    }
}

次に、モバイルを横向きに変更すると、他のアクティビティ クラス「BaseFullScreenActivity」が呼び出され、正常に動作します。その呼び出されたアクティビティ内で、 onConfigurationChanged() メソッドを再度オーバーライドして、この子アクティビティを再び終了します。

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
    {
        super.onConfigurationChanged(newConfig);
        finish();
    }
}

ただし、この 2 回目の向きの変更 (縦向きに戻る) で、子のアクティビティが終了し、メインのアクティビティが再び表示されるはずですが、アプリがクラッシュし、次のエラーが表示されます。

android.app.SuperNotCalledException: 
Activity MyActivity did not call through to super.onConfigurationChanged()

両方のアクティビティで onStop() メソッドをオーバーライドし、super.onStop() を呼び出しましたが、役に立ちませんでした。

他のアイデアはありますか?
よろしくお願いします。

4

2 に答える 2

5

エラーが示唆することをしないのはなぜですか? スーパー クラスへの呼び出しを if ステートメントの外に移動すると、2 回目の向きの変更でアプリがクラッシュすることはありません。

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    super.onConfigurationChanged(newConfig);
    if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
    {
        startActivity(new Intent(this, BaseFullScreenActivity.class));
    }
}
于 2012-10-19T23:37:32.547 に答える
0

Sam が述べたように、super() 呼び出しはメソッドの最初のステートメントにする必要があります。( http://developer.android.com/training/basics/activity-lifecycle/pausing.html )

于 2012-10-19T23:45:03.767 に答える