Android сохраняет переменные JS в изменении ориентации Webview - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть веб-просмотр, и я загружаю в него несколько html5 + js. Мой веб-приложение чрезвычайно интенсивно использует данные. Используя функции состояния, я могу вернуться к правильной «странице», на которой я должен находиться после изменения ориентации, однако мое веб-приложение находится в опасности, поскольку все мои переменные javascript также были сброшены.

Есть ли способ сохранить все мои переменные javascript и восстановить их при изменении ориентации веб-просмотра? А как насчет значений, введенных в текстовые поля формы?

==================

Я достиг определенного прогресса в этом. В моем JS есть хук, который называется requestState(); Когда вызывается эта функция, он отправляет все мои переменные JS на сторону android / java через интерфейс JS.

На стороне Java я сохраняю эту информацию, используя getLastNonConfigurationInstance и onRetainNonConfigurationInstance. Я протестировал вывод, и он действительно сохраняет все мои переменные JS в моем объекте на Java прямо перед изменением состояния активности при изменении ориентации.

Проблема в том, чтобы вернуться туда, где я должен быть. У меня в JS есть функция, противоположная requestState();, которая называется setState(input);. Эта функция вызывается со стороны Android с помощью mywebview.loadUrl( "javascript:setState(" + jsonStr + ")" );. Я делаю это в конце моего onCreate, после дефлятирования веб-просмотра и вызова wv.restoreState(savedInstanceState);.

Что я заметил, так это то, что setState не было определено во время моего вызова! На самом деле, ни один из моих JS-скриптов не готов к вызову или даже не существует / не найден в конце функции onCreate моей деятельности. Чтобы проверить свое здравомыслие, я попытался mywebview.loadUrl( "javascript:alert(" + jsonStr + ")" ); и действительно увидел то, что ожидал увидеть - предупреждение со всеми значениями моих переменных. Однако я заметил, что сама страница не отображалась до появления предупреждения. Как мне решить проблему?

Ответы [ 2 ]

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

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

То есть, когда вы видитетег для вызова этой функции.

Конечно, если уже есть, то все становится немного сложнее.Но только немного ...

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...