Как сохранять состояние WebView при onDestroyView фрагмента
WebView находится внутри Fragment. Мне необходимо при выполнении onDestroyView и при обратном onViewCreated восстанавливать состояние WebView.
Минимально, что нужно восстанавливать:
- историю переходов
- текущую страницу
Есть несколько вариантов:
- Использовать
webView.saveStateиwebview.restoreState.
Пример кода:
private var webViewState: Bundle? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
webViewState?.let {
webview.restoreState(it)
}
}
override fun onDestroyView() {
webViewState = Bundle().also {
webView.saveState(it)
}
super.onDestroyView()
}
- Сохранять WebView в поле фрагмента, в момент onDestroyView удалять его из View, а в момент onViewCreated добавлять обратно в View.
Пример кода:
private lateinit var webView: WebView
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//....
addWebView()
}
override fun onDestroyView() {
removeWebView()
super.onDestroyView()
}
private fun removeWebView() {
if (::webView.isInitialized) {
webView.setDownloadListener(null)
webView.webChromeClient = null
browserParentLayout.removeView(webView)
}
}
private fun addWebView() {
if (!::webView.isInitialized) {
webView = WebView(requireContext()).apply {
id = View.generateViewId()
layoutParams = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT
)
}
}
browserParentLayout.addView(webView, 0)
webView.invalidate()
webView.setDownloadListener(DownloadListener())//...
webView.webChromeClient = WebChromeClient()//...
}
Вариант 1, вроде как решение из коробки, но при использовании этого подхода, в моем случае, веб страница восстанавливается в непонятное состояние, появляются какие-то элементы(view элементы) которых не должно быть(до сохранения состояния на экране не было этих элементов, либо они были скрытыми либо что..). Так-же не сохраняются открытые JS страницы (диалоги). Что-то странное происходит, возможно это из-за самого нашего сайта (реализации страницы)..
Вопрос в следующем: какие вы видите проблемы при использовании варианта №2?