5

アクティビティの縦向きと横向きに異なるレイアウトを適用する必要があります。また、縦向きの場合はアラートを表示する必要があります。

android:configChanges="orientation|keyboardHidden"AndroidManifest で指定しています。また、次のように onConfigurationChanged メソッドをオーバーライドします。

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    Log.d("tag", "config changed");
    super.onConfigurationChanged(newConfig);

    int orientation = newConfig.orientation;
    if (orientation == Configuration.ORIENTATION_PORTRAIT)
        Log.d("tag", "Portrait");
    else if (orientation == Configuration.ORIENTATION_LANDSCAPE)
        Log.d("tag", "Landscape");
    else
        Log.w("tag", "other: " + orientation);

    ....
}

横向きから縦向きに回転すると、ログは次のようになります。

config changed
Portrait

しかし、縦から横に変更すると、次のようになります

config changed
Portrait
config changed
Landscape

onConfigurationChanged が 2 回呼び出されるのはなぜですか? どうすれば回避できますか?

4

5 に答える 5

3

ここで別の質問に対する私の答えを参照してください:https ://stackoverflow.com/a/3252547/338479

つまり、構成の変更を正しく処理することは困難です。構成の変更によりアプリケーションが停止および再起動される直前に呼び出されるonRetainNonConfigurationInstance()を実装することをお勧めします。この方法を使用して、必要なものをすべて保存し(「これ」が適切な選択です)、システムにアプリを破棄させます。

アプリが新しい構成で再起動したら、getLastNonConfigurationInstance()を使用して保存したばかりの状態を取得し、それを使用して、バンドルや共有設定をいじくり回すことなくアプリケーションを続行します。

于 2013-01-25T16:19:33.560 に答える
1

以前の向きを保存して、実際に変更されたかどうかを確認するだけです。

アクティビティなどのために設定しAndroidManifest.xml android:configChangesた場合は、呼び出されません。これにより、実装が大幅に簡単になります。もちろん、レイアウトも縦向きから横向きに変わります。keyboardHidden|orientationonCreate

于 2012-08-11T23:39:51.240 に答える
0

Androidは、向きを変更するとアクティビティの新しいインスタンスを開始するため、onCreateを使用するのが理想的な方法です。中断したところから再開するには、アクティビティのデータを明らかに保存/復元する必要がありますが、イベントがいくつあってもアプリケーションのフォーカスが外れる/強制終了される可能性があるため、とにかくこれを行う必要があります。

于 2010-09-26T17:49:05.997 に答える
0

onStart ではなく onCreate を使用することをお勧めします。唯一の違いは、アプリケーションがフォアグラウンドになったときに onStart が呼び出されることです。これは、UI を再初期化するまでユーザーを待たせたい場合ではありません。それ以外の場合は、if 条件に基づいて setContentView 呼び出しを変更してください。

于 2010-09-25T21:37:16.083 に答える
0

ローテーションをこのように処理することを選択した理由はありますか? 方向の変更時にアクティビティが再開されないため高速ですが、正しく思い出せば、通常はお勧めしません。向きの変更を処理する別の方法は、オーバーライド、onConfigurationChanged()オーバーライドなどの代わりにonCreate()onStart()onResume()

@Override
public void onStart() {
    super.onStart();
    int orientation = getWindowManager().getDefaultDisplay().getOrientation();
    if(orientation == Configuration.ORIENTATION_PORTRAIT) {
        Log.i(TAG, "Orientation is portrait");
        // show whatever alerts here
    }
}

次に、縦向き用と横向き用の 2 つのレイアウトを指定します。レイアウトのポートレート バージョンは に残りres/layout/whatever.xml、ランドスケープ バージョンは に保存されres/layout-land/whatever.xmlます。AndroidGuys は、このトピックに関する優れた記事をたくさん書いています。http://androidguys.com/?s=rotational+forces&x=9&y=9 を参照してください。

于 2010-09-25T19:32:24.790 に答える