【问题标题】:Jetpack Navigation with WebView is not working properly带有 WebView 的 Jetpack 导航无法正常工作
【发布时间】:2019-03-06 12:01:21
【问题描述】:

我有一个Fragment,里面有ViewPager,它包含3个标签。我使用 Jetpack 导航 来处理导航。在第一个选项卡中,我有一个 FragmentWebView,根据 Jetpack 导航的本机行为,每次我们导航到另一个片段时它都会重新创建视图。

这就是问题所在,每次我导航回WebViewFragment 时,它都会加载 URL。这是无法使用实时数据处理的。

我曾尝试缓存 Webview 内容,但这只是加快了加载速度,但不是即时的。

这是我的代码 sn-p

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")
    }
}

任何帮助都会得到帮助,在此先感谢!

【问题讨论】:

    标签: android android-viewpager android-webview android-jetpack android-architecture-navigation


    【解决方案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()
        }
    }
    

    【讨论】: