5

Androidアプリケーションで向きの変更を処理する必要があります。この目的のために、私はOrientationEventListenerコンビニエンスクラスを使用することにしました。しかし、彼のコールバックメソッドにはやや奇妙な振る舞いがあります。

私のアプリケーションはポートレートモードで起動し、最終的にはlanscapeモードに切り替わります。onOrientationChangedいくつかの追加のUI処理ロジックを提供するコールバックメソッドで実行されているカスタムコードがあります-にいくつかの呼び出しがありfindViewByIdます。奇妙なことに、ランドスケープモードからポートレートモードに切り替えるとonOrientationChanged、コールバックが2回呼び出され、さらに悪いことに、2番目の呼び出しは不良を処理しています メソッドはを返し始めます。これらの呼び出しは、MainThreadから直接行われます。ContextfindViewByIdnull

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    listener = new OrientationListener();
}

    @Override
protected void onResume() {     
    super.onResume();
    // enabling listening
    listener.enable();
}
    @Override
protected void onPause() {
    super.onPause();
    // disabling listening
    listener.disable();
}

Activityオリエンテーションハドリングを処理するものを除いて、ロジックなしでダミーを使用して同じ動作を複製しました。Ctrl + F11を押して、Android 2.2エミュレーターから向きの切り替えを開始し ます。何が問題になっている可能性がありますか?

Upd:実装する内部クラスOrientationEventListener

private class OrientationListener extends OrientationEventListener {
    public OrientationL() {
        super(getBaseContext());
    }

    @Override
    public void onOrientationChanged(int orientation) {

        toString();

    }
}

}

4

3 に答える 3

5

これは、エミュレーターでのみ文書化されたバグです。実際のデバイスは、この二重のライフサイクルイベントの動作を示しません。しばらく前に同じ問題が発生しましたが、実際のデバイスでは消えます。

物理的な電話を手に入れるまで、一方向の向きの変化をテストするだけでできる場合は、問題を無視することをお勧めします。それ以外の場合は、最初のセットをすでに通過したことを示す静的ブール値を維持することで、ライフサイクル呼び出しの2番目のセットを「スキップ」できる可能性があります。

詳細については、この問題レポートを参照してください。

于 2010-06-08T19:36:49.227 に答える
3

onConfigurationChangedを使用してみましたか?

@Override
public void onConfigurationChanged(Configuration newConfig) {
 if(newConfig.equals(Configuration.ORIENTATION_LANDSCAPE)…
于 2010-06-07T09:17:56.210 に答える
1

次のようなアクティビティタグのマニフェストファイルにandroid:configChanges="orientation"を追加します

<activity android:label="@string/app_name" android:configChanges="orientation" android:name=".com.androidpeople">

于 2010-11-10T11:43:42.457 に答える