Как сохранять состояние WebView при onDestroyView фрагмента

WebView находится внутри Fragment. Мне необходимо при выполнении onDestroyView и при обратном onViewCreated восстанавливать состояние WebView.

Минимально, что нужно восстанавливать:

  1. историю переходов
  2. текущую страницу

Есть несколько вариантов:

  1. Использовать 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()
}
  1. Сохранять 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?


Ответы (0 шт):