Ошибка ориентации экрана Android - PullRequest
2 голосов
/ 29 октября 2010

Я использую Android HTC HERO версии 2.1.

Деятельность, которую я пишу:

<activity android:name=".gogogo"
          android:label="@string/app_name"
          android:theme="@style/Theme.mine"
          android:screenOrientation="landscape"
          android:configChanges="orientation">

позвольте моей ориентации измениться на ландшафт.

Тем не менее, я понял, что каждый раз, когда я нажимаю кнопку «питания», а затем возвращаюсь к своей деятельности, она всегда начинается с портрета.

Я попробовал игру: TEETER, которая была написана не мной. Есть такая же проблема, кто-нибудь знает, как это исправить ??

Редактировать: it always start at portrait. -> Я имею в виду, если вы вернетесь от питания, вы должны прокрутить вниз, чтобы сделать все, есть что-то вроде блокировки экрана.

Вы можете видеть, что в верхней части экрана есть «строка состояния», и в это время ориентация «portrait». Поэтому после того, как Вы немного прокрутите «блокировку экрана», вы увидите, что активность (например, TEETER) находится в состоянии «portrait». При прокрутке до конца ориентация действия внезапно изменится на состояние «landscape».

Итак, вывод таков: моя деятельность вынуждена ориентироваться один раз. И я очень хочу знать, как это исправить!

Ответы [ 3 ]

1 голос
/ 24 июня 2012

Не уверен, что это та же проблема, но вот проблема, с которой я столкнулся:

  • Я заставляю ориентацию как пейзаж в манифесте
  • У моего действия есть два вида поверхности (предварительный просмотр камеры и слой поверх него)
  • После нажатия кнопки питания и возвращения, мои взгляды внезапно оказались в неправильной ориентации

Кажется, это та же проблема, что и другой вопрос: Отключить ориентацию, но определить ориентацию

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

Вот мой обходной путь:

  • в onPause, отсоединить представления с помощью removeView (мое приложение имеет программно созданные представления, а не макет xml)
  • в onResume, сначала проверьте, является ли ориентация запрошенной (getResources (). GetConfiguration (). Ориентация). Если это так, заново присоедините представления (addContentView или что-то еще).
  • если ориентация не соответствует ожидаемой, вызовите setRequestedOrientation
  • onConfigurationChanged будет вызываться, чтобы сообщить, что ориентация была изменена на ту, которую вы запросили. На этом этапе вы можете снова присоединить представления с помощью setContentView.

Кажется немного сложным, но это то, что мне пришлось пройти в моем конкретном случае, так как мои представления создаются динамически и напрямую привязываются к стандартному FrameLayout действия. Может быть, тогда я пропустил некоторые поведения по умолчанию из-за этого, но таким образом я смог добиться требуемой реактивности.

1 голос
/ 29 октября 2010

Хай Стивен Ши: Просьба пройти через эту страницу руководства разработчика.

http://developer.android.com/guide/topics/manifest/activity-element.html

и попробуйте эту строку

 android:windowSoftInputMode="stateUnspecified|adjustPan" 
0 голосов
/ 27 ноября 2011

Не уверен, можно ли это назвать исправлением, но это своего рода обходной путь.

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    if (hasFocus)
        setContentView(mGameView);
    else
        setContentView(mEmptyView);
}

Где mGameView - ваш обычный контент, а mEmptyView - просто объект View.Действие будет по-прежнему отображаться в портрете для кадра или двух, но оно не будет видимо пользователю.

Я проверял это с HTC Hero и Nexus S.

...