#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()
}
}