Навигация Jetpack с WebView не работает должным образом

#android #android-viewpager #android-webview #android-jetpack #android-architecture-navigation

#Android #android-viewpager #android-webview #android-jetpack #android-архитектура-навигация

Вопрос:

У меня внутри есть Fragment with ViewPager , который содержит 3 вкладки. Я использовал навигацию в Jetpack для управления навигацией. На первой вкладке, которая у меня есть Fragment с WebView , в соответствии с собственным поведением Jetpack navigation, она воссоздает вид каждый раз, когда мы переходим к другому фрагменту.

Вот в чем проблема, он загружает URL-адрес каждый раз, когда я возвращаюсь к WebView Fragment . Это невозможно обработать с использованием оперативных данных.

Я пытался кэшировать Webview содержимое, но это просто ускоряет загрузку, но это происходит не сразу.

вот мой фрагмент кода

MyFragment.kt

 class MyFragment : BaseViewModelFragment<MyViewModel>(), View.OnClickListener {
    override fun getContentResource(): Int = R.layout.fragment_my
    override fun buildViewModel(): MyViewModel {
        return ViewModelProviders.of(this, viewModelFactory)[MyViewModel::class.java]
    }

    override fun initLiveDataObservers() {
        super.initLiveDataObservers()
    }

    override fun initViews() {
        super.initViews()
        setupWebView()
    }

    private fun setupWebView() = with(webView) {
        settings.domStorageEnabled = true
        settings.setAppCachePath("/data/data/"   activity?.packageName   "/cache")
        settings.setAppCacheEnabled(true)
        settings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK
        webViewClient = MyWebviewClient()
        webChromeClient = MyChromeClient()
        loadUrl("http://google.com")
    }
}
  

Любая помощь будет принята, заранее спасибо!

Ответ №1:

Я исправил это, добавив WebView время выполнения

 class MyFragment : BaseViewModelFragment<MyViewModel>(), View.OnClickListener {

    private val myWebview by lazy {
        WebView(requireContext().applicationContext).apply {
            webViewClient = MyWebviewClient()
            webChromeClient = MyChromeClient()
        }
    }

    override fun getContentResource(): Int = R.layout.fragment_home

    override fun buildViewModel(): MyViewModel {
        return ViewModelProviders.of(this, viewModelFactory)[MyViewModel::class.java]
    }

    override fun initLiveDataObservers() {
        super.initLiveDataObservers()
    }

    override fun initViews() {
        super.initViews()
        container.addView(myWebview, ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT)
        )
    }

    override fun onDestroyView() {
        (myWebview.parent as ViewGroup).removeView(myWebview)
        super.onDestroyView()
    }
}