Проблема заключается в производительности после ротации. WebView должен перезагрузить страницу, что может быть немного утомительно.
Каков наилучший способ обработки изменения ориентации без перезагрузки страницы из источника каждый раз?
android
webview
orientation
glennanthonyb
источник
источник
Ответы:
Если вы не хотите, чтобы WebView перезагружался при изменении ориентации, просто переопределите onConfigurationChanged в своем классе Activity:
И установите атрибут android: configChanges в манифесте:
Для получения дополнительной информации см .:
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
https://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges
источник
configChanges
атрибут добавляется в подклассовое действие 2) Если ваше приложение зависит от нескольких проектов,configChanges
атрибут добавляется в манифест одного из вершина дерева зависимостей (это может быть не проект, содержащий класс Activity).onConfigurationChanged
метод переопределения бесполезен.Изменить: этот метод больше не работает, как указано в документации
Оригинальный ответ:
Это можно сделать, переписав
onSaveInstanceState(Bundle outState)
вашу активность и позвонивsaveState
из веб-просмотра:Затем восстановите это в своем onCreate после того, как веб-представление было раздуто, конечно:
источник
Лучшим ответом на это будет следующая документация Android, найденная здесь. В основном это предотвратит перезагрузку Webview:
При желании вы можете исправить аномалии (если они есть), переопределив
onConfigurationChanged
действие:источник
Я попытался использовать onRetainNonConfigurationInstance (возвращая WebView ), затем вернуть его с getLastNonConfigurationInstance во время onCreate и переназначить его.
Кажется, пока не работает. Я не могу помочь, но думаю, что я действительно близко! Пока что я просто получаю пустой / белый фон вместо WebView . Размещать здесь в надежде, что кто-то может помочь протолкнуть этот за финишную черту.
Может быть, мне не следует передавать WebView . Возможно, объект из WebView ?
Другой метод, который я попробовал - не мой любимый - установить это в упражнении:
... а потом ничего не делать здесь:
Это работает, но это не может считаться лучшей практикой .
Между тем, у меня также есть один ImageView, который я хочу автоматически обновлять в зависимости от поворота. Это оказывается очень легко. Под моей
res
папке, у меня естьdrawable-land
иdrawable-port
ПРОВЕДЕТ вариации пейзаж / портрет, то я используюR.drawable.myimagename
для ImageView «s источника и Android„делает правильно“- яй!... кроме случаев, когда вы смотрите изменения конфигурации, тогда это не так. :(
Так что я в ссоре. Используйте onRetainNonConfigurationInstance, и ротация ImageView работает, но постоянство WebView не ... или используйте onConfigurationChanged, и WebView остается стабильным, но ImageView не обновляется. Что делать?
Последнее замечание: в моем случае форсирование ориентации не является приемлемым компромиссом. Мы действительно хотим изящно поддержать ротацию. Вроде как, как работает приложение Android Browser! ;)
источник
Один компромисс - избежать вращения. Добавьте это, чтобы исправить действие только для книжной ориентации.
источник
Лучший способ обрабатывать изменения ориентации и предотвращать перезагрузку WebView при повороте.
Имея это в виду, чтобы предотвратить вызов onCreate () каждый раз, когда вы меняете ориентацию, вам нужно добавить
android:configChanges="orientation|screenSize" to the AndroidManifest.
или просто ..
источник
Просто напишите следующие строки кода в вашем файле манифеста - больше ничего. Это действительно работает:
источник
Я понимаю, что это немного поздно, однако это ответ, который я использовал при разработке своего решения:
AndroidManifest.xml
WebClient.java
источник
Вы можете попробовать использовать
onSaveInstanceState()
иonRestoreInstanceState()
в своей деятельности для вызоваsaveState(...)
иrestoreState(...)
на вашем экземпляре WebView.источник
Это 2015 год, и многие люди ищут решение, которое все еще работает на телефонах Jellybean, KK и Lollipop. После долгих попыток я нашел способ сохранить веб-вид без изменений после изменения ориентации. Моя стратегия заключается в том, чтобы хранить веб-представление в отдельной статической переменной в другом классе. Затем, если происходит ротация, я отсоединяю веб-представление от действия, ожидаю завершения ориентации и снова присоединяю веб-представление к действию. Например ... сначала поместите это в ваш манифест (клавиатура скрытая и клавиатура необязательны):
В ОТДЕЛЬНОМ КЛАССЕ ПРИМЕНЕНИЯ положите:
В ДЕЯТЕЛЬНОСТЬ вкладывается:
Наконец, простой XML:
В моем решении есть несколько вещей, которые можно улучшить, но я уже потратил много времени, например: более короткий способ проверки, был ли Activity запущен в первый раз вместо использования хранилища SharedPreferences. Этот подход сохраняет веб-просмотр без изменений (afaik), его текстовые поля, метки, пользовательский интерфейс, переменные javascript и состояния навигации, которые не отражаются в URL.
источник
Единственное, что вам нужно сделать, это добавить этот код в ваш файл манифеста:
источник
Обновление: текущая стратегия состоит в том, чтобы переместить экземпляр WebView в класс приложения вместо сохраненного фрагмента, когда он отсоединен, и снова присоединить его к резюме, как это делает Джош. Чтобы предотвратить закрытие приложения, вы должны использовать службу переднего плана, если вы хотите сохранить состояние, когда пользователь переключается между приложениями.
Если вы используете фрагменты, вы можете использовать сохранить экземпляр WebView. Веб-представление будет сохранено как член экземпляра класса. Однако вы должны прикрепить веб-представление в OnCreateView и отсоединить перед OnDestroyView, чтобы предотвратить его уничтожение родительским контейнером.PS Кредиты идут в kcoppock ответитьЧто касается «SaveState ()», он больше не работает в соответствии с официальной документацией :
источник
setRetainInstance
и сохраняет фрагмент, представление (и, следовательно, WebView) все еще разрушается.Эти методы могут быть переопределены для любого действия, оно просто позволяет вам сохранять и восстанавливать значения при каждом создании / уничтожении действия, когда при изменении ориентации экрана действие уничтожается и воссоздается в фоновом режиме, поэтому вы можете использовать эти методы для временного хранения / восстановления состояний во время изменения.
Вы должны глубже изучить два следующих метода и посмотреть, подходит ли оно вашему решению.
http://developer.android.com/reference/android/app/Activity.html
источник
Лучшее решение, которое я нашел, чтобы сделать это без утечки предыдущей
Activity
ссылки и без установкиconfigChanges
.., это использовать MutableContextWrapper .Я реализовал это здесь: https://github.com/slightfoot/android-web-wrapper/blob/48cb3c48c457d889fc16b4e3eba1c9e925f42cfb/WebWrapper/src/com/example/webwrapper/BrowserActivity.java
источник
Это единственное, что сработало для меня (я даже использовал состояние сохранения экземпляра,
onCreateView
но это было не так надежно).Я сделал держатель Singleton для состояния WebView. Состояние сохраняется до тех пор, пока существует процесс приложения.
РЕДАКТИРОВАТЬ:
loadDataWithBaseURL
не было необходимости, он работал так же хорошо, простоХотя я читаю, это не обязательно хорошо работает с куки.
источник
попробуй это
источник
Эта страница решает мою проблему, но я должен внести небольшие изменения в исходную:
Эта часть имеет небольшую проблему для меня это. При втором изменении ориентации приложение завершается нулевым указателем
с помощью этого он работал для меня:
источник
Вы должны попробовать это:
onServiceConnected
методе получите WebView и вызовитеsetContentView
метод для визуализации вашего WebView.Я протестировал его, и он работает, но не с другими WebViews, такими как XWalkView или GeckoView.
источник
источник
Мне нравится это решение http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/
В соответствии с этим мы повторно используем тот же экземпляр WebView. Это позволяет сохранить историю навигации и положение прокрутки при изменении конфигурации.
источник