Переключатель активности на ориентацию изменился? - PullRequest
2 голосов
/ 25 октября 2019

Как я могу переключиться на другое занятие при повороте телефона?

Мои требования:

  • Упражнение A и B - только портрет
  • Acitvity L - альбомнаятолько
  • Когда отображается ландшафтный режим A или B, вместо этого запускается L. Когда будет отображаться портрет L, отображаются A или B.

Я могу создать это поведение, ожидая кнопку возврата. Когда она нажата, я получаю A / B в альбомной ориентации или L в портретной, что я хочу предотвратить.

Что я делаю (Действия A и B, но L похожа)

Чтобы вызвать вызов активности при изменении ориентации:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    int newOrientation = newConfig.orientation;
    if (newOrientation == Configuration.ORIENTATION_LANDSCAPE) {
        Intent intent = new Intent(this, ActivityL.class);
        startActivity(intent);
    }

    super.onConfigurationChanged(newConfig);
}

Я хочу что-то вроде следующего. Но ручная (пере) установка ориентации предотвращает вызов onConfigurationChanged () вообще:

@Override
public void onResume(){
    super.onResume();

    int currentOrientation = this.getResources().getConfiguration().orientation;
    if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }
}

Конечно, то же самое происходит, если я делаю это в других методах жизненного цикла или onCreate (...).

Все действия имеют:

  android:screenOrientation="sensor"

Я также пытался имитировать изменение ориентации, используя угол поворота, но тогда поведение кажется в основном случайным и даже близко к нормальному изменению ориентации.

1 Ответ

0 голосов
/ 28 октября 2019

Я полагаю, setRequestedOrientation () переопределяет то, что я определил в AndroidManifest:

android:screenOrientation="sensor"

Мне нужно сбросить его на датчик, чтобы вернуть автоматические изменения ориентации:

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

    // Reset to sensor:
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
}

Я немного удивлен, что вызов его в onConfigurationChanged (..) работает, так как этот метод больше не вызывается при изменении ориентации. Но я думаю, что конфигурация изменяется каким-то другим образом, когда работа возобновляется (когда нажата кнопка «Назад»).

...