Android 3.2 Изменение ориентации Motorola Xoom

Я хочу иметь 2 разных режима ориентации в зависимости от устройства: если экран устройства очень большой, ориентация должна быть ЛАНДШАФТ, а если экран устройства меньше, ориентация должна быть ПОРТРЕТ.

Я сделал следующую проверку:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //Set orientation for tablets and phones
    if (isXLarge()) {     
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    } else {    
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    }

    setContentView(R.layout.activity_main); 
}

Запись манифеста для действия:

<activity 
    android:configChanges="keyboardHidden" 
    android:launchMode="singleTop" 
    android:theme="@android:style/Theme.NoTitleBar" 
    android:name=".MyActivity"/>

Он отлично работает на мобильных телефонах, однако на планшетах Motorola Xoom с Android 3.2 работает некорректно.

Если предположить, что планшет физически удерживается в портретном режиме, происходит следующая последовательность действий:

  1. Активность создается и отображается в портретном режиме — это отображается визуально в течение полсекунды.
  2. Активность уничтожается и воссоздается в ландшафтном режиме.

Проблема в том, что всегда есть средний переход в той ориентации, в которой планшет физически удерживается в данный момент, и после этого активность воссоздается с нужной ориентацией.

Спасибо за любую информацию или совет о проблеме и, пожалуйста, сообщите мне, если вам нужна дополнительная информация.

Метод isXLarge() правильно возвращает тип отображения


person luben    schedule 10.09.2012    source источник


Ответы (1)


Если вы обрабатываете изменения ориентации самостоятельно, то лучший способ сделать это — объявить android:configChanges="orientation" в манифесте действия и переопределить метод onConfigurationChanged(). В вашем случае вы устанавливаете ориентацию в методе onCreate(), но система изменит ориентацию, если пользователь физически изменит ориентацию.

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

person Gan    schedule 10.09.2012
comment
Можете ли вы объяснить больше, как это может быть полезно? Я не хочу сам управлять ориентацией до тех пор, пока мне это абсолютно необходимо - мне просто нужна фиксированная ЛАНДШАФТНАЯ ориентация на экране XLarge и фиксированная КНИЖНАЯ ориентация на меньших экранах. - person luben; 11.09.2012
comment
Итак, если я правильно понимаю, вы хотите отображать свое приложение в ландшафтном режиме для экранов XLarge, независимо от того, в какой ориентации оно удерживается физически. В таком случае, если вы не переопределите метод onConfigurationChanged(), ваша активность будет уничтожена и воссоздана каждый раз при изменении физической ориентации. Это означает, что вы должны сохранять данные/состояния каждый раз, когда это происходит. Из вашего вопроса я подозревал, что это может быть причиной того, почему он был уничтожен и воссоздан. - person Gan; 11.09.2012
comment
Мне кажется, что я недостаточно искусен, чтобы понять, что вы имеете в виду, и я не могу использовать ваш ответ в качестве руководства для решения проблемы. Поэтому я проголосую +1 и продолжу думать о другом решении... - person luben; 11.09.2012
comment
попробуйте добавить ориентацию в configChanges в манифесте, как это android:configChanges="keyboardHidden | orientation". Это позволит избежать воссоздания активности. - person Gan; 11.09.2012