Вращающееся устройство Android с Phonegap вылетает - PullRequest
2 голосов
/ 17 февраля 2012

Желаемое поведение таково:

  • При вращении макет реконструируется - чтобы соответствовать новому размеру экрана. Реконструкция выполняется с использованием JQuery и математики, а не CSS.

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

Для этого я сделал следующее:

  • Добавлен android: configChanges = "ориентация | клавиатура скрыта" для всех действий в манифесте, чтобы самостоятельно обрабатывать изменение ориентации (примечание: я не нацеливаюсь на определенный API, поэтому я полагаю, что по умолчанию это API 1. Это означает добавление screenSize в configChanges не требуется).

  • Добавлен слушатель для смены ориентации:

    window.onorientationchange = function () { переменная ориентация = оконная ориентация; переключатель (ориентация) { случай 0: updateScaling (); перерыв;

        case 90:
            updateScaling();
            break;
    
        case -90:
            updateScaling();
          break;
      }
    }
    

updateScaling корректирует только макет.

И это иногда работает, но иногда происходит сбой устройства (эмулятора, а также реального устройства). В логе эмулятора вижу это предупреждение:

WARN / ActivityManager (73): Тайм-аут запуска истек, отказавшись от блокировки пробуждения!

Я провел исследование и обнаружил, что добавление более длинного loadUrlTimeoutValue в упражнении может помочь, и я добавил super.setIntegerProperty ("loadUrlTimeoutValue", 60000); к основной деятельности, но, как и ожидалось, тоже не помогает.

Я обнаружил, что многие люди жалуются на проблемы с ротацией в PhoneGap. Может быть, Framework просто глючит для этого аспекта? Я также тестировал устройства Apple, и там у меня даже не было возможности отловить вращающееся событие - эмулятор iPhone даже не изменил ориентацию, iPad изменил его, но обработчик события не вызывается, а макет остается прежним. Я попытался использовать обходной путь, который я нашел, прикрепляя слушателя к документу. Но это тоже не помогло.

Существует ли полностью надежный способ восстановления макета при вращении устройства? Если нет, могу ли я отключить вращение после того, как приложение было инициализировано определенным (это означает, что я не хочу исправлять книжную или альбомную ориентацию - я хочу, чтобы приложение отключало изменения вращения после того, как оно было инициализировано с использованием текущего). Есть ли надежный способ сделать это?

Спасибо

1 Ответ

0 голосов
/ 20 февраля 2012

Я не совсем уверен, исправил ли это проблему сбоя или что-то еще, что я сделал "в пути".

Но я добавил слушателя, который работает надежно - по крайней мере, на Android:

$(window).resize(function() {
    updateScaling($('body').width());
}); 

Он всегда вызывается и передает правильную ширину. Насколько я помню он тоже работает с screen.width

В updateScaling я вычисляю scalingFactor и корректирую свои элементы.

Я удалил window.onorientationchange.

Примечание. Может случиться так, что в момент сбоя у меня был android: configChanges = "keyboardHidden" вместо android: configChanges = "direction | keyboardHidden" в манифесте. AFAIK это означает, что система восстанавливает активность, это может объяснить время ожидания. Но в этом случае я не знаю, почему super.setIntegerProperty ("loadUrlTimeoutValue", 60000); не помогло.

Заключение

$ (окно) .resize в сочетании с android: configChanges = "direction | keyboardHidden" работает для меня.

...