1

次のコードを使用して、ユーザーがデバイスを回転させている間にアクティビティの向きを変更しています。これは初めて正常に機能しますが、再度呼び出されることはありません。私を修正してください。

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);            
        Log.d("ACTIVITY","CHANGING ORIENTATION"); //No i18n
        if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
            Log.d(TAG, "ORIENTATION CHANGED TO PORTRAIT"); // No I18N
            setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
        } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Log.d(TAG, "ORIENTATION CHANGED TO LANDSCAPE"); // No I18N
            setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE);
        }
    }

@Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        Log.d("ACTIVITY","ON RESTORE INSTANCESTATE");   //No i18n
        super.onRestoreInstanceState(savedInstanceState);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.d("ACTIVITY","ON SAVE INSTANCESTATE");  //No i18n
        super.onSaveInstanceState(outState);
    }
4

1 に答える 1

2

使用後setRequestedOrientation(...);は、ローテーション通知を受け取る権限がなくなります。
ローテーションが発生したときに特別なアクションを実行したい場合は、OrientationEventListener

編集:
注意: このコードはポートレートを 80 ~ 90 度、>= 320 として取ります。これは変更できます。
このコードがまだ UI スレッドで実行されていない場合は、UI スレッドで setRequestedOrientation を実行する必要がある場合もあります。

次のようにする必要があります。

mOrientationListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_UI) {

@Override
    public void onOrientationChanged(int rotation) {
        boolean changed = false;

        if (((rotation >= 0) && (rotation <= 80)) || (rotation >= 320)) {
                        setRequestedOrientation(Configuration.ORIENTATION_PORTRAIT);
        } else {
                        setRequestedOrientation(Configuration.ORIENTATION_LANDSCAPE);
        }
    }
};
mOrientationListener.enable();
于 2013-05-20T11:18:59.283 に答える