3

縦向きと逆向きの縦向きの 2 つの方向のみをサポートするアプリを開発しているのでsensorPortrait、マニフェストに " " を記述しましたが、うまく動作します。

問題は、これら 2 つの方向に異なるレイアウトを使用したいということです。

有効にすると、" " 呼び出しがsensorPortrait無効になります。onConfigurationChange

私が使う:

orientationEventListener = new OrientationEventListener(this) {
        @Override
        public void onOrientationChanged(int i) {
            int newOrientation = getScreenOrientation();
            if (newOrientation != orientation) {
                orientation = newOrientation;
                if (newOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
                    ...
                    setContentView(R.layout.main);

                } else if (newOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) {
                    ...
                    setContentView(R.layout.main_reverse_portrait);
                }
            }
        }
    };
    orientationEventListener.enable();

問題は、このコードが向きを変更した後に呼び出されることです。そのため、ユーザーが最初に電話を回転させると、以前のレイアウトが表示され、Android によって自動的に回転され、次に正しいレイアウトが表示されます。容認できないように見えますが、修正方法を知っていますか?

4

3 に答える 3

9

configChangesメソッドを使用してオーバーライドすることをお勧めしますonConfigurationChanged(Configuration newConfig)。サポートしている向きでない場合は、向きを無視してください。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (newOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
         ...
         setContentView(R.layout.main);
    } else if (newOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT) {
         ...
         setContentView(R.layout.main_reverse_portrait);
    }
}

この答えはさらに役立つかもしれません。

Android: 向きの変更を検出する

アップデート:

アクティビティが破棄される原因となっている構成変更を特定するgetChangingConfigurations()ために使用できる方法があります。onStop()この場合、onConfigurationChanged()コールバックを使用する必要はありません。

更新 2:

sensorPortraitで回転角度を手動で使用および確認しonCreateます。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    Display display = ((WindowManager)  
          context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    int rotation = display.getRotation();
    if (rotation == Surface.ROTATION_180) { // reverse portrait
       setContentView(R.layout.main_reverse_portrait);
    } else {  // for all other orientations
       setContentView(R.layout.main);
    }
    ...
}
于 2012-09-19T11:03:26.563 に答える
0

u debug uは、いくつかの構成でonConfigurationChangedが2回呼び出されることに気付くでしょう(ランドスケープモードに移行するときに2回呼び出されていたと思います)。だから私たちの問題はそこにあります。onConfigurationChangedは、setContentを2回呼び出します。Uは、現在の表示幅を古い幅または同様のものと比較することによって、これを回避する必要があります。これがうまくいかない場合は私に知らせてください、私は自分で試してみてください:) gl!

于 2012-09-24T06:36:25.037 に答える
0

アプリの onPause で、ユーザーへの通知に対してレイアウトを非表示にするコードを記述してみてください。

それは物事を少し良くするのに役立つかもしれません

于 2012-09-26T06:24:27.027 に答える