使用 WebView 的 Jetpack 导航无法正常工作
Jetpack Navigation with WebView is not working properly
我有一个 Fragment
里面有 ViewPager
,它包含 3 个标签。我使用 Jetpack navigation 来处理导航。在第一个选项卡中,我有一个 Fragment
和 WebView
,根据 Jetpack 导航的本机行为,它会在我们每次导航到另一个片段时重新创建视图。
这是问题所在,每次我导航回 WebView
Fragment
时它都会加载 URL。这无法使用实时数据处理。
我尝试缓存 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")
}
}
如有任何帮助,请提前致谢!
我通过添加 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()
}
}
我有一个 Fragment
里面有 ViewPager
,它包含 3 个标签。我使用 Jetpack navigation 来处理导航。在第一个选项卡中,我有一个 Fragment
和 WebView
,根据 Jetpack 导航的本机行为,它会在我们每次导航到另一个片段时重新创建视图。
这是问题所在,每次我导航回 WebView
Fragment
时它都会加载 URL。这无法使用实时数据处理。
我尝试缓存 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")
}
}
如有任何帮助,请提前致谢!
我通过添加 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()
}
}